/usr/lib/ruby/vendor_ruby/treetop/compiler/node_classes/parsing_rule.rb is in ruby-treetop 1.6.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | module Treetop
module Compiler
class ParsingRule < Runtime::SyntaxNode
def compile(builder)
compile_inline_module_declarations(builder)
generate_method_definition(builder)
end
def compile_inline_module_declarations(builder)
parsing_expression.inline_modules.each_with_index do |inline_module, i|
inline_module.compile(i, builder, self)
builder.newline
end
end
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 << result_var
end
end
def generate_cache_lookup(builder)
builder.if_ "node_cache[:#{name}].has_key?(index)" do
cache_address = "node_cache[:#{name}][index]"
builder.assign 'cached', cache_address
builder.if_ "cached" do
# Handle lazily instantiated nodes:
builder << "#{cache_address} = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true"
builder << '@index = cached.interval.end'
end
builder << 'return cached'
end
end
def generate_cache_storage(builder, result_var)
builder.assign "node_cache[:#{name}][start_index]", result_var
end
def method_name
"_nt_#{name}"
end
def name
nonterminal.text_value
end
end
end
end
|