Parsing/RPN to infix conversion: Difference between revisions
Content added Content deleted
m (added a fourth column to the operator precedence table, added highlighting to better read the operator symbols, elided the necessity of a "Note".) |
m (→{{header|Sidef}}: updated code) |
||
Line 2,822: | Line 2,822: | ||
{{trans|Perl 6}} |
{{trans|Perl 6}} |
||
<lang ruby>func p(pair, prec) { |
<lang ruby>func p(pair, prec) { |
||
pair[0] < prec |
pair[0] < prec ? "( #{pair[1]} )" : pair[1] |
||
} |
} |
||
func rpm_to_infix(string) { |
func rpm_to_infix(string) { |
||
say "#{'='*17}\n#{string}" |
say "#{'='*17}\n#{string}" |
||
var stack = [] |
var stack = [] |
||
string.each_word { |w| |
string.each_word { |w| |
||
if (w ~~ /\d/) { |
if (w ~~ /\d/) { |
||
stack << [9, w |
stack << [9, Num(w)] |
||
} |
} |
||
else { |
else { |
||
var y = stack.pop |
var y = stack.pop |
||
var x = stack.pop |
var x = stack.pop |
||
given(w) { |
given(w) { |
||
when ('^') { stack << [4, [p(x,5), w, p(y,4)].join(' ')] } |
when ('^') { stack << [4, [p(x,5), w, p(y,4)].join(' ')] } |
||
Line 2,840: | Line 2,840: | ||
when (<+ ->) { stack << [2, [p(x,2), w, p(y,2)].join(' ')] } |
when (<+ ->) { stack << [2, [p(x,2), w, p(y,2)].join(' ')] } |
||
} |
} |
||
say stack |
say stack |
||
} |
} |
||
} |
} |
||
'-'*17 |
say '-'*17 |
||
stack.map{_[1]} |
stack.map{_[1]} |
||
} |
} |
||
var tests = [ |
var tests = [ |
||
'3 4 2 * 1 5 - 2 3 ^ ^ / +', |
'3 4 2 * 1 5 - 2 3 ^ ^ / +', |
||
'1 2 + 3 4 + ^ 5 6 + ^', |
'1 2 + 3 4 + ^ 5 6 + ^', |
||
] |
] |
||
tests.each { say rpm_to_infix(_).join(' ') }</lang> |
tests.each { say rpm_to_infix(_).join(' ') }</lang> |
||
{{out}} |
{{out}} |