accumulate_subexpression_result()
click to toggle source
def accumulate_subexpression_result
builder.accumulate accumulator_var, subexpression_result_var
end
accumulator_var()
click to toggle source
def accumulator_var
var(:accumulator)
end
assign_failure(start_index_var)
click to toggle source
def assign_failure(start_index_var)
assign_result("nil")
end
assign_lazily_instantiated_node()
click to toggle source
def assign_lazily_instantiated_node
assign_result("true")
end
assign_result(value_ruby)
click to toggle source
def assign_result(value_ruby)
builder.assign result_var, value_ruby
end
compile(address, builder, parent_expression)
click to toggle source
def compile(address, builder, parent_expression)
@address = address
@builder = builder
@parent_expression = parent_expression
end
declared_module_name()
click to toggle source
def declared_module_name
parent_expression && parent_expression.node_class_name
end
decorated?()
click to toggle source
def decorated?
parent_expression && (parent_expression.node_class_name || parent_expression.node_class_name || parent_expression.inline_module_name)
end
epsilon_node()
click to toggle source
def epsilon_node
"instantiate_node(SyntaxNode,input, index...index)"
end
extend_result(module_name)
click to toggle source
def extend_result(module_name)
builder.extend result_var, module_name
end
extend_result_with_declared_module()
click to toggle source
def extend_result_with_declared_module
extend_result declared_module_name if declared_module_name
end
extend_result_with_inline_module()
click to toggle source
def extend_result_with_inline_module
extend_result inline_module_name if inline_module_name
end
init_value(var_symbol)
click to toggle source
def init_value(var_symbol)
case var_symbol
when :accumulator then '[]'
when :start_index then 'index'
else nil
end
end
inline_module_name()
click to toggle source
def inline_module_name
parent_expression && parent_expression.inline_module_name
end
node_class_name()
click to toggle source
def node_class_name
parent_expression && parent_expression.node_class_name || 'SyntaxNode'
end
obtain_new_subexpression_address()
click to toggle source
def obtain_new_subexpression_address
@subexpression_address = builder.next_address
end
on_one_line(expression)
click to toggle source
def on_one_line(expression)
expression.text_value.tr("\n", ' ')
end
optional_arg(arg)
click to toggle source
def optional_arg(arg)
if arg
", #{arg}"
else
''
end
end
reset_index()
click to toggle source
def reset_index
builder.assign '@index', start_index_var
end
result_var()
click to toggle source
def result_var
var(:result)
end
start_index_var()
click to toggle source
def start_index_var
var(:start_index)
end
subexpression_result_var()
click to toggle source
def subexpression_result_var
"r#{subexpression_address}"
end
subexpression_success?()
click to toggle source
def subexpression_success?
subexpression_result_var
end
use_vars(*var_symbols)
click to toggle source
def use_vars(*var_symbols)
@var_symbols = var_symbols
builder << var_initialization
end
var(var_symbol)
click to toggle source
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
var_initialization()
click to toggle source
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