Class: Treetop::Compiler::ParsingRule

Inherits:
Runtime::SyntaxNode show all
Defined in:
lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb

Instance Attribute Summary

Attributes inherited from Runtime::SyntaxNode

#elements, #input, #interval, #parent

Instance Method Summary collapse

Methods inherited from Runtime::SyntaxNode

#empty?, #extension_modules, #initialize, #inspect, #nonterminal?, #terminal?, #text_value

Constructor Details

This class inherits a constructor from Treetop::Runtime::SyntaxNode

Instance Method Details

#compile(builder) ⇒ Object



5
6
7
8
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 5

def compile(builder)
  compile_inline_module_declarations(builder)
  generate_method_definition(builder)
end

#compile_inline_module_declarations(builder) ⇒ Object



10
11
12
13
14
15
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 10

def compile_inline_module_declarations(builder)
  parsing_expression.inline_modules.each_with_index do |inline_module, i|
    inline_module.compile(i, self, builder)
    builder.newline
  end
end

#generate_cache_lookup(builder) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 34

def generate_cache_lookup(builder)
  builder.if_ "node_cache[:#{name}].has_key?(index)" do
    builder.assign 'cached', "node_cache[:#{name}][index]"
    builder << '@index = cached.interval.end if cached'
    builder << 'return cached'
  end
end

#generate_cache_storage(builder, result_var) ⇒ Object



42
43
44
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 42

def generate_cache_storage(builder, result_var)
  builder.assign "node_cache[:#{name}][start_index]", result_var
end

#generate_method_definition(builder) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 17

def generate_method_definition(builder)
  builder.reset_addresses
  expression_address = builder.next_address
  result_var = "r#{expression_address}"
  
  builder.method_declaration(method_name) do
    builder.assign 'start_index', 'index'
    generate_cache_lookup(builder)
    builder.newline
    parsing_expression.compile(expression_address, builder)
    builder.newline
    generate_cache_storage(builder, result_var)
    builder.newline          
    builder << "return #{result_var}"
  end
end

#method_nameObject



46
47
48
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 46

def method_name
  "_nt_#{name}"
end

#nameObject



50
51
52
# File 'lib/gems/treetop-1.2.4/lib/treetop/compiler/node_classes/parsing_rule.rb', line 50

def name
  nonterminal.text_value
end