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