class Logicality::Interpreter::SimpleInterpreter
This class implements NodeVisitor
and gives each type of node the proper type of visitor implementation.
Attributes
resolver[R]
Public Class Methods
new(resolver)
click to toggle source
# File lib/logicality/interpreter/simple_interpreter.rb, line 17 def initialize(resolver) raise ArgumentError, 'Resolver is required' unless resolver @resolver = resolver end
Public Instance Methods
error(node)
click to toggle source
# File lib/logicality/interpreter/simple_interpreter.rb, line 23 def error(node) raise ArgumentError, "Visitor cant process node token type: #{node.token.type}" end
visit_binary_operator_node(node)
click to toggle source
# File lib/logicality/interpreter/simple_interpreter.rb, line 27 def visit_binary_operator_node(node) if node.token.type == Lexer::Token::Type::AND_OP visit(node.left) && visit(node.right) elsif node.token.type == Lexer::Token::Type::OR_OP visit(node.left) || visit(node.right) else error(node) end end
visit_unary_operator_node(node)
click to toggle source
# File lib/logicality/interpreter/simple_interpreter.rb, line 37 def visit_unary_operator_node(node) if node.token.type == Lexer::Token::Type::NOT_OP !visit(node.child) else error(node) end end
visit_value_operand_node(node)
click to toggle source
# File lib/logicality/interpreter/simple_interpreter.rb, line 45 def visit_value_operand_node(node) if node.value == 'true' true elsif node.value == 'false' || node.value == 'null' false else resolve_value(node.value) end end
Private Instance Methods
resolve_value(value)
click to toggle source
# File lib/logicality/interpreter/simple_interpreter.rb, line 57 def resolve_value(value) raise ArgumentError, "No resolver function: #{value}" if resolver.nil? !!resolver.call(value) end