# File lib/racc/statetransitiontable.rb, line 252 252: def act2actid(act) 253: case act 254: when Shift then act.goto_id 255: when Reduce then -act.ruleid 256: when Accept then @states.shift_n 257: when Error then @states.reduce_n * 1 258: else 259: raise "racc: fatal: wrong act type #{act.class} in action table" 260: end 261: end
# File lib/racc/statetransitiontable.rb, line 174 174: def addent(all, arr, chkval, ptr) 175: max = arr.size 176: min = nil 177: arr.each_with_index do |item, idx| 178: if item 179: min ||= idx 180: end 181: end 182: ptr.push(7777) # mark 183: arr = arr[min...max] 184: all.push [arr, chkval, mkmapexp(arr), min, ptr.size - 1] 185: end
# File lib/racc/statetransitiontable.rb, line 110 110: def gen_action_tables(t, states) 111: t.action_table = yytable = [] 112: t.action_check = yycheck = [] 113: t.action_default = yydefact = [] 114: t.action_pointer = yypact = [] 115: e1 = [] 116: e2 = [] 117: states.each do |state| 118: yydefact.push act2actid(state.defact) 119: if state.action.empty? 120: yypact.push nil 121: next 122: end 123: vector = [] 124: state.action.each do |tok, act| 125: vector[tok.ident] = act2actid(act) 126: end 127: addent e1, vector, state.ident, yypact 128: end 129: set_table e1, e2, yytable, yycheck, yypact 130: end
# File lib/racc/statetransitiontable.rb, line 132 132: def gen_goto_tables(t, grammar) 133: t.goto_table = yytable2 = [] 134: t.goto_check = yycheck2 = [] 135: t.goto_pointer = yypgoto = [] 136: t.goto_default = yydefgoto = [] 137: e1 = [] 138: e2 = [] 139: grammar.each_nonterminal do |tok| 140: tmp = [] 141: 142: # decide default 143: freq = Array.new(@states.size, 0) 144: @states.each do |state| 145: st = state.goto_table[tok] 146: if st 147: st = st.ident 148: freq[st] += 1 149: end 150: tmp[state.ident] = st 151: end 152: max = freq.max 153: if max > 1 154: default = freq.index(max) 155: tmp.map! {|i| default == i ? nil : i } 156: else 157: default = nil 158: end 159: yydefgoto.push default 160: 161: # delete default value 162: tmp.pop until tmp.last or tmp.empty? 163: if tmp.compact.empty? 164: # only default 165: yypgoto.push nil 166: next 167: end 168: 169: addent e1, tmp, (tok.ident - grammar.nonterminal_base), yypgoto 170: end 171: set_table e1, e2, yytable2, yycheck2, yypgoto 172: end
# File lib/racc/statetransitiontable.rb, line 75 75: def generate 76: t = StateTransitionTable.new(@states) 77: gen_action_tables t, @states 78: gen_goto_tables t, @grammar 79: t.token_table = token_table(@grammar) 80: t.reduce_table = reduce_table(@grammar) 81: t.reduce_n = @states.reduce_n 82: t.shift_n = @states.shift_n 83: t.nt_base = @grammar.nonterminal_base 84: t.token_to_s_table = @grammar.symbols.map {|sym| sym.to_s } 85: t 86: end
# File lib/racc/statetransitiontable.rb, line 196 196: def mkmapexp(arr) 197: i = ii = 0 198: as = arr.size 199: map = '' 200: maxdup = RE_DUP_MAX 201: curr = nil 202: while i < as 203: ii = i + 1 204: if arr[i] 205: ii += 1 while ii < as and arr[ii] 206: curr = '-' 207: else 208: ii += 1 while ii < as and not arr[ii] 209: curr = '.' 210: end 211: 212: offset = ii - i 213: if offset == 1 214: map << curr 215: else 216: while offset > maxdup 217: map << "#{curr}{#{maxdup}}" 218: offset -= maxdup 219: end 220: map << "#{curr}{#{offset}}" if offset > 1 221: end 222: i = ii 223: end 224: Regexp.compile(map, 'n') 225: end
# File lib/racc/statetransitiontable.rb, line 88 88: def reduce_table(grammar) 89: t = [0, 0, :racc_error] 90: grammar.each_with_index do |rule, idx| 91: next if idx == 0 92: t.push rule.size 93: t.push rule.target.ident 94: t.push(if rule.action.empty? # and @params.omit_action_call? 95: then :_reduce_none 96: else "_reduce_#{idx}".intern 97: end) 98: end 99: t 100: end
# File lib/racc/statetransitiontable.rb, line 227 227: def set_table(entries, dummy, tbl, chk, ptr) 228: upper = 0 229: map = '-' * 10240 230: 231: # sort long to short 232: entries.sort! {|a,b| b[0].size <=> a[0].size } 233: 234: entries.each do |arr, chkval, expr, min, ptri| 235: if upper + arr.size > map.size 236: map << '-' * (arr.size + 1024) 237: end 238: idx = map.index(expr) 239: ptr[ptri] = idx - min 240: arr.each_with_index do |item, i| 241: if item 242: i += idx 243: tbl[i] = item 244: chk[i] = chkval 245: map[i] = oo 246: end 247: end 248: upper = idx + arr.size 249: end 250: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.