Parsing/RPN to infix conversion: Difference between revisions

→‎{{header|Perl}}: same logic, more readable
m (→‎{{header|C++}}: Remove vanity tags)
(→‎{{header|Perl}}: same logic, more readable)
Line 2,495:
 
=={{header|Perl}}==
<lang perl>use strict;
use warnings;
# RPN to infix conversion
use feature 'say';
#
 
# Nigel Galloway April 1st., 2012
my $numnumber = '([+-/$]?(?:\.\d+|\d+(?:\.\d*)?))';
#
my $WSboperator = '(?:^|\s[-+)*/^]';
 
$WSa = '(?:\s+|$)';
my @tests = ('1 2 + 3 4 + ^ 5 6 + ^', '3 4 2 * 1 5 - 2 3 ^ ^ / +');
$num = '([+-/$]?(?:\.\d+|\d+(?:\.\d*)?))';
 
$op = '([-+*/^])';
whilefor (<>@tests) {
$n = -1my(@elems,$n);
$n = -1;
while (s/$WSb$num\s+$num\s+$op$WSa/' '.('$'.++$n).' '/e) {@elems[$n] = '('.$1.$3.$2.')';}
while (s!(\$)(\d+)!@elems[$2]!e) {}
s/
print(substr($_,2,-2)."\n");
\s* (?<left>$number) # 1st operand (will be 'left' in infix)
}
\s+ (?<right>$number) # 2nd operand (will be 'right' in infix)
</lang>
\s+ (?<op>$operator) # operator
Produces:
(?:\s+|$) # more to parse, or done?
<pre>
1 2 + 3 4 + ^ 5 6 + ^/
>rpn.pl
' '.('$'.++$n).' ' # placeholders
1 2 + 3 4 + ^ 5 6 + ^
/ex) {
((1+2)^(3+4))^(5+6)
$elems[$n] = "($+{left}$+{op}$+{right})" # infix expression
3 4 2 * 1 5 - 2 3 ^ ^ / +
}
3+((4*2)/((1-5)^(2^3)))
while (
</pre>
s/ (\$)(\d+) # for each placeholder
/ $elems[$2] # evaluate expression, substitute numeric value
/ex
) { say } # track progress
print( say '=>' . substr($_,2,-2)."\n");
}</lang>
{{out}}
<pre> ($2^$3)
(($0^$1)^$3)
(((1+2)^$1)^$3)
(((1+2)^(3+4))^$3)
(((1+2)^(3+4))^(5+6))
=>((1+2)^(3+4))^(5+6)
 
(3+$4)
(3+($0/$3))
(3+((4*2)/$3))
(3+((4*2)/($1^$2)))
(3+((4*2)/((1-5)^$2)))
(3+((4*2)/((1-5)^(2^3))))
=>3+((4*2)/((1-5)^(2^3)))</pre>
 
=={{header|Perl 6}}==
<lang perl6>my @tests = '3 4 2 * 1 5 - 2 3 ^ ^ / +',
2,392

edits