class Racc::StateTransitionTableGenerator

def gen_goto_tables(t, grammar)

def gen_goto_tables(t, grammar)
  t.goto_table   = yytable2  = []
  t.goto_check   = yycheck2  = []
  t.goto_pointer = yypgoto   = []
  t.goto_default = yydefgoto = []
  e1 = []
  e2 = []
  grammar.each_nonterminal do |tok|
    tmp = []
    # decide default
    freq = Array.new(@states.size, 0)
    @states.each do |state|
      st = state.goto_table[tok]
      if st
        st = st.ident
        freq[st] += 1
      end
      tmp[state.ident] = st
    end
    max = freq.max
    if max > 1
      default = freq.index(max)
      tmp.map! {|i| default == i ? nil : i }
    else
      default = nil
    end
    yydefgoto.push default
    # delete default value
    tmp.pop until tmp.last or tmp.empty?
    if tmp.compact.empty?
      # only default
      yypgoto.push nil
      next
    end
    addent e1, tmp, (tok.ident - grammar.nonterminal_base), yypgoto
  end
  set_table e1, e2, yytable2, yycheck2, yypgoto
end