Class: Ikra::AST::Interpreter
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
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
|