class Omnium::Interpreter::Core

The visitor pattern is used to traverse the AST. This class may be thought of as a 'tree visitor'.

Attributes

name[R]
symbol_table[R]

Public Class Methods

new(parser) click to toggle source
# File lib/omnium/interpreter/core.rb, line 14
def initialize(parser)
  @parser = parser
  @symbol_table = {}
  @name = nil
end

Public Instance Methods

interpret() click to toggle source
# File lib/omnium/interpreter/core.rb, line 20
def interpret
  tree = @parser.parse
  visit(tree)
end
visit_Assignment(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 48
def visit_Assignment(node)
  symbol_table[node.left.name.intern] = visit(node.right)
end
visit_BinaryOperator(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 66
def visit_BinaryOperator(node)
  @type = node.operator.type

  if plus?
    visit(node.left) + visit(node.right)
  elsif minus?
    visit(node.left) - visit(node.right)
  elsif multiply?
    visit(node.left) * visit(node.right)
  elsif divide?
    visit(node.left) / visit(node.right)
  end
end
visit_Block(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 32
def visit_Block(node)
  node.variable_declarations.each do |variable_declaration|
    visit(variable_declaration)
  end

  visit(node.compound_statement)
end
visit_Compound(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 40
def visit_Compound(node)
  node.children.each { |child| visit(child) }
end
visit_DataType(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 58
def visit_DataType(node)
  # noop
end
visit_Identifier(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 52
def visit_Identifier(node)
  symbol_table.fetch(node.name.intern)
rescue KeyError
  raise(InterpreterError, "Variable '#{node.name}' not found")
end
visit_NoOperation(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 62
def visit_NoOperation(node)
  # noop
end
visit_Number(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 90
def visit_Number(node)
  node.value
end
visit_Program(node) click to toggle source

concrete visitor operations below

# File lib/omnium/interpreter/core.rb, line 27
def visit_Program(node)
  @name = node.name
  visit(node.block)
end
visit_UnaryOperator(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 80
def visit_UnaryOperator(node)
  @type = node.operator.type

  if plus?
    +visit(node.operand)
  elsif minus?
    -visit(node.operand)
  end
end
visit_VariableDeclaration(node) click to toggle source
# File lib/omnium/interpreter/core.rb, line 44
def visit_VariableDeclaration(node)
  # noop
end