Class: Ikra::AST::Interpreter

Inherits:
Visitor show all
Defined in:
lib/ast/interpreter.rb

Overview

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

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Visitor

#visit_begin_node, #visit_block_def_node, #visit_break_node, #visit_class_def_node, #visit_for_node, #visit_if_node, #visit_ivar_read_node, #visit_lvar_read_node, #visit_lvar_write_node, #visit_meth_def_node, #visit_node, #visit_program_node, #visit_return_node, #visit_root_node, #visit_source_code_expr_node, #visit_ternary_node, #visit_until_node, #visit_until_post_node, #visit_var_def_node, #visit_while_node, #visit_while_post_node

Class Method Details

.interpret(node) ⇒ Object



5
6
7
# File 'lib/ast/interpreter.rb', line 5

def self.interpret(node)
    return node.accept(self.new)
end

Instance Method Details

#visit_array_node(node) ⇒ Object



33
34
35
36
37
# 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) ⇒ Object



17
18
19
# File 'lib/ast/interpreter.rb', line 17

def visit_bool_node(node)
    return node.value
end

#visit_const_node(node) ⇒ Object



39
40
41
# 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) ⇒ Object



13
14
15
# File 'lib/ast/interpreter.rb', line 13

def visit_float_node(node)
    return node.value
end

#visit_hash_node(node) ⇒ Object



43
44
45
46
47
48
49
50
51
# 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) ⇒ Object



9
10
11
# File 'lib/ast/interpreter.rb', line 9

def visit_int_node(node)
    return node.value
end

#visit_nil_node(node) ⇒ Object



21
22
23
# File 'lib/ast/interpreter.rb', line 21

def visit_nil_node(node)
    return nil
end

#visit_send_node(node) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
# 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) ⇒ Object



29
30
31
# File 'lib/ast/interpreter.rb', line 29

def visit_string_node(node)
    return node.value
end

#visit_symbol_node(node) ⇒ Object



25
26
27
# File 'lib/ast/interpreter.rb', line 25

def visit_symbol_node(node)
    return node.value
end