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[1]} )" : pair[1];
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.to_f];
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;
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}}