class Racc::ParserClassGenerator - RDoc Documentation

# class Racc::ParserClassGenerator

### Public Class Methods

new(states) click to toggle source

    # File lib/racc/statetransitiontable.rb, line 269
    def initialize(states)
      @states = states
      @grammar = states.grammar
    end

### Public Instance Methods

generate() click to toggle source

    # File lib/racc/statetransitiontable.rb, line 274
    def generate
      table = @states.state_transition_table
      c = Class.new(::Racc::Parser)
      c.const_set :Racc_arg, [table.action_table,
                              table.action_check,
                              table.action_default,
                              table.action_pointer,
                              table.goto_table,
                              table.goto_check,
                              table.goto_default,
                              table.goto_pointer,
                              table.nt_base,
                              table.reduce_table,
                              table.token_value_table,
                              table.shift_n,
                              table.reduce_n,
                              false]
      c.const_set :Racc_token_to_s_table, table.token_to_s_table
      c.const_set :Racc_debug_parser, true
      define_actions c
      c
    end

### Private Instance Methods

define_actions(c) click to toggle source

    # File lib/racc/statetransitiontable.rb, line 299
        def define_actions(c)
          c.module_eval "def _reduce_none(vals, vstack) vals[0] end"
          @grammar.each do |rule|
            if rule.action.empty?
              c.funcall(:alias_method, "_reduce_#{rule.ident}", :_reduce_none)
            else
              c.funcall(:define_method, "_racc_action_#{rule.ident}", &rule.action.proc)
              c.module_eval(<<-End, __FILE__, __LINE__ + 1)
                def _reduce_#{rule.ident}(vals, vstack)
                  _racc_action_#{rule.ident}(*vals)
                end
              End
            end
          end
        end