class Treetop::Compiler::ParsingRule

def compile(builder)

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

def compile_inline_module_declarations(builder)

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_cache_lookup(builder)

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)

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

def generate_method_definition(builder)

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 method_name

def method_name
  "_nt_#{name}"
end

def name

def name
  nonterminal.text_value
end