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