/usr/lib/ruby/vendor_ruby/treetop/compiler/node_classes/parsing_expression.rb is in ruby-treetop 1.6.8-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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | module Treetop
module Compiler
class ParsingExpression < Runtime::SyntaxNode
attr_reader :address, :builder, :subexpression_address, :var_symbols, :parent_expression
def compile(address, builder, parent_expression)
@address = address
@builder = builder
@parent_expression = parent_expression
end
def node_class_name
parent_expression && parent_expression.node_class_name || 'SyntaxNode'
end
def declared_module_name
parent_expression && parent_expression.node_class_name
end
def inline_module_name
parent_expression && parent_expression.inline_module_name
end
def decorated?
parent_expression && (parent_expression.node_class_name || parent_expression.node_class_name || parent_expression.inline_module_name)
end
def optional_arg(arg)
if arg
", #{arg}"
else
''
end
end
def use_vars(*var_symbols)
@var_symbols = var_symbols
builder << var_initialization
end
def result_var
var(:result)
end
def accumulator_var
var(:accumulator)
end
def start_index_var
var(:start_index)
end
def subexpression_result_var
"r#{subexpression_address}"
end
def subexpression_success?
subexpression_result_var
end
def obtain_new_subexpression_address
@subexpression_address = builder.next_address
end
def accumulate_subexpression_result
builder.accumulate accumulator_var, subexpression_result_var
end
def assign_result(value_ruby)
builder.assign result_var, value_ruby
end
def extend_result(module_name)
builder.extend result_var, module_name
end
def extend_result_with_declared_module
extend_result declared_module_name if declared_module_name
end
def extend_result_with_inline_module parent_expression = nil
if parent_expression && parent_expression.parent_modules.size > 0
parent_expression.parent_modules.each do |inline|
extend_result inline.module_name
end
end
extend_result inline_module_name if inline_module_name
end
def reset_index
builder.assign '@index', start_index_var
end
def epsilon_node
"instantiate_node(SyntaxNode,input, index...index)"
end
def assign_failure(start_index_var)
assign_result("nil")
end
def assign_lazily_instantiated_node
assign_result("true")
end
def var_initialization
left, right = [], []
var_symbols.each do |symbol|
if init_value(symbol)
left << var(symbol)
right << init_value(symbol)
end
end
if left.empty?
""
else
left.join(', ') + ' = ' + right.join(', ')
end
end
def var(var_symbol)
case var_symbol
when :result then "r#{address}"
when :accumulator then "s#{address}"
when :start_index then "i#{address}"
else raise "Unknown var symbol #{var_symbol}."
end
end
def init_value(var_symbol)
case var_symbol
when :accumulator then '[]'
when :start_index then 'index'
else nil
end
end
def begin_comment(expression)
#builder << "# begin #{on_one_line(expression)}"
end
def end_comment(expression)
#builder << "# end #{on_one_line(expression)}"
end
def on_one_line(expression)
expression.text_value.tr("\n", ' ')
end
def expected
nil # Overridden for terminal parse failures
end
end
end
end
|