class Ikra::AST::Interpreter

Executes this AST in the Ruby interpreter. Not possible for all nodes.

Public Class Methods

interpret(node) click to toggle source
# File lib/ast/interpreter.rb, line 5
def self.interpret(node)
    return node.accept(self.new)
end

Public Instance Methods

visit_array_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 33
def visit_array_node(node)
    return node.values.map do |value|
        value.accept(self)
    end
end
visit_bool_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 17
def visit_bool_node(node)
    return node.value
end
visit_const_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 39
def visit_const_node(node)
    return node.find_behavior_node.binding.eval(node.identifier)
end
visit_float_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 13
def visit_float_node(node)
    return node.value
end
visit_hash_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 43
def visit_hash_node(node)
    result = {}

    node.hash.each do |key, value|
        result[key.accept(self)] = value.accept(self)
    end

    return result
end
visit_int_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 9
def visit_int_node(node)
    return node.value
end
visit_nil_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 21
def visit_nil_node(node)
    return nil
end
visit_send_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 53
def visit_send_node(node)
    receiver = node.receiver.accept(self)
    arguments = node.arguments.map do |arg| arg.accept(self) end

    if node.block_argument == nil
        return receiver.send(node.selector, *arguments)
    else
        # TODO: Implement
        block = receiver.block_argument.accept(self)
        return receiver.send(node.selector, *arguments, &block)
    end
end
visit_string_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 29
def visit_string_node(node)
    return node.value
end
visit_symbol_node(node) click to toggle source
# File lib/ast/interpreter.rb, line 25
def visit_symbol_node(node)
    return node.value
end