Anonymous user
Parsing/RPN/Ruby: Difference between revisions
m
add another couple of tests
m (link to pages that link here) |
m (add another couple of tests) |
||
Line 73:
rpn_expr << op_stack.pop
end
obj = self.new(rpn_expr.join(" "))
obj
end
Line 101 ⟶ 103:
end
@value = stack.pop
@value
end
Line 135 ⟶ 139:
# express the AST as a string
def to_infix
expr = to_infix_tree.to_s
expr
end
# express the AST as a string, but in a form that allows Ruby to evaluate it
def to_ruby
expr = to_infix_tree.to_ruby
expr
end
Line 210 ⟶ 218:
rpn = RPNExpression.new @rpn_expr
value = rpn.eval
▲ debug "value = #{value}"
assert_equal @value, value
end
Line 217 ⟶ 224:
rpn = RPNExpression.new @rpn_expr
infix = rpn.to_infix
▲ debug "infix = #{infix}"
▲ debug "ruby = #{rpn.to_ruby}"
assert_equal @infix_expr, infix
assert_equal @value, eval(rpn.to_ruby)
Line 225 ⟶ 230:
def test_infix_to_rpn
rpn = RPNExpression.from_infix @infix_expr
end
▲ debug "rpn = #{rpn_expr}"
assert_equal @rpn_expr, rpn_expr▼
def test_other_expressions
old_debug = $DEBUG
$DEBUG = false
rpn = ["56 34 213.7 + * 678 -", "1 56 35 + 16 9 - / +"]
infix = ["56 * ( 34 + 213.7 ) - 678", "1 + ( 56 + 35 ) / ( 16 - 9 )"]
value = ["13193.2", "14.0"]
[0, 1].each do |idx|
obj = RPNExpression.new rpn[idx]
assert_equal value[idx], "%.1f" % obj.eval
assert_equal infix[idx], obj.to_infix
assert_equal value[idx], "%.1f" % eval(obj.to_ruby)
obj = RPNExpression.from_infix infix[idx]
end
$DEBUG = old_debug
end
end</lang>
Line 252 ⟶ 274:
/ DIV [3, 0.0001220703125]
+ ADD [3.0001220703125]
.
for Infix expression: 3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3
Line 273 ⟶ 295:
^ PUSH OP ["3", "4", "2", "*", "1", "5", "-", "2"] ["+", "/", "^", "^"]
3 PUSH V ["3", "4", "2", "*", "1", "5", "-", "2", "3"] ["+", "/", "^", "^"]
..
for RPN expression: 3 4 2 * 1 5 - 2 3 ^ ^ / +
Term Action Stack
Line 290 ⟶ 312:
/ DIV [node[3], node[/]<left=node[*]<left=node[4], right=node[2]>, right=node[^]<left=node[-]<left=node[1], right=node[5]>, right=node[^]<left=node[2], right=node[3]>>>]
+ ADD [node[+]<left=node[3], right=node[/]<left=node[*]<left=node[4], right=node[2]>, right=node[^]<left=node[-]<left=node[1], right=node[5]>, right=node[^]<left=node[2], right=node[3]>>>>]
.
Finished tests in 0.
|