module Temill::RaccHack

Public Class Methods

included(klass) click to toggle source

override all actions and make them call before_reduce/after_reduce before/after each action is executed

# File lib/temill/parser.rb, line 58
def self.included(klass)
  #racc_action_table,
  #racc_action_check,
  #racc_action_default,
  #racc_action_pointer,
  #racc_goto_table,
  #racc_goto_check,
  #racc_goto_default,
  #racc_goto_pointer,
  #racc_nt_base,
  #racc_reduce_table,
  #racc_token_table,
  #racc_shift_n,
  #racc_reduce_n,
  #racc_use_result_var = klass::Racc_arg

  racc_reduce_table = klass::Racc_arg[9]

  racc_reduce_table.each_slice(3).map{| _,_,method_name |
    method_name
  }.uniq.each{| method_name |
    begin
      method = klass.instance_method(method_name)
    rescue NameError
      next
    end
    method.tap{| original_umethod |
      klass.__send__(:define_method, method_name){| val,_values,result |
        new_val = before_reduce(val, _values, result)
        new_result = original_umethod.bind(self).call(new_val, _values, result)
        after_reduce(val, _values, new_result)
      }
    }
  }
end

Public Instance Methods

after_reduce(val, _values, result) click to toggle source

should return new result

Note that val is equal to the object passed to before_reduce, not new val returned by before_reduce

# File lib/temill/parser.rb, line 103
def after_reduce(val, _values, result)
  result
end
before_reduce(val, _values, result) click to toggle source

should return new val

# File lib/temill/parser.rb, line 95
def before_reduce(val, _values, result)
  val
end