class SimpleLogic::InfixOperation
Public Instance Methods
eval(context)
click to toggle source
# File lib/simple_logic/syntax_nodes.rb, line 6 def eval(context) rpn(shunting_yard(values_and_operators(context))) end
list()
click to toggle source
# File lib/simple_logic/syntax_nodes.rb, line 10 def list lhs.list + [rhs] end
rpn(input)
click to toggle source
# File lib/simple_logic/syntax_nodes.rb, line 40 def rpn(input) results = [] input.each do |object| if object.instance_of?(PrecedenceTable::Operator) r, l = results.pop, results.pop results << object.apply(l, r) else results << object end end results.first end
shunting_yard(input)
click to toggle source
# File lib/simple_logic/syntax_nodes.rb, line 24 def shunting_yard(input) [].tap do |rpn| operator_stack = [] input.each do |object| if object.instance_of?(PrecedenceTable::Operator) op1 = object rpn << operator_stack.pop while (op2 = operator_stack.last) && (op1.left_associative? ? op1.precedence <= op2.precedence : op1.precedence < op2.precedence) operator_stack << op1 else rpn << object end end rpn << operator_stack.pop until operator_stack.empty? end end
values_and_operators(context)
click to toggle source
# File lib/simple_logic/syntax_nodes.rb, line 14 def values_and_operators(context) list.map do |node| if node.instance_of?(Treetop::Runtime::SyntaxNode) PrecedenceTable.lookup(node.text_value) else node.eval(context) end end end