Parsing/RPN to infix conversion: Difference between revisions
→{{header|Perl}}: same logic, more readable
Thundergnat (talk | contribs) m (→{{header|C++}}: Remove vanity tags) |
SqrtNegInf (talk | contribs) (→{{header|Perl}}: same logic, more readable) |
||
Line 2,495:
=={{header|Perl}}==
<lang perl>use strict;
use warnings;
use feature 'say';
my $
my @tests = ('1 2 + 3 4 + ^ 5 6 + ^', '3 4 2 * 1 5 - 2 3 ^ ^ / +');
▲$num = '([+-/$]?(?:\.\d+|\d+(?:\.\d*)?))';
$n = -1;
while (
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
(?:\s+|$) # more to parse, or done?
' '.('$'.++$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)))▼
while (
s/ (\$)(\d+) # for each placeholder
/ $elems[$2] # evaluate expression, substitute numeric value
/ex
) { say } # track progress
▲}</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 ^ ^ / +',
|