441: #line 610 "lalr1_parser.ipk" 442: def initLALR1items(self): 443: self.kernelitems = kernels = self.kernelsoflalr1items() 444: props = {} 445: la_table = [] 446: for x in range(len(kernels)): 447: la_table.append([]) 448: for y in range(len(kernels[x])): 449: la_table[x].append([]) 450: la_table[0][0] = [EOF] 451: if self.verbosity>1: 452: print "initLALR1items, kernels done, calculating propagations and spontaneous lookaheads" 453: state_i = 0 454: for itemset in kernels: 455: if self.verbosity>1: 456: print ".", 457: sp, pr = self.lookaheads(itemset) 458: for ns, (pi, ri), t in sp: 459: inner = kernels[ns].index((pi, ri)) 460: la_table[ns][inner].append(t) 461: props[state_i] = pr 462: state_i = state_i + 1 463: return la_table, props 464: 465: 466: def calc_LALR1items(self): 467: la_table, props = self.initLALR1items() 468: if self.verbosity>1: 469: print "done init LALR1items" 470: soi = self.kernelitems 471: while 1: 472: added_la = 0 473: state_i = 0 474: for state in la_table: 475: ii = 0 476: for propterms in state: 477: if not propterms: 478: ii = ii + 1 479: continue 480: item = soi[state_i][ii] 481: ii = ii + 1 482: try: 483: proplist = props[state_i][item] 484: except KeyError: 485: continue 486: for pstate, pitem in proplist: 487: inner = soi[pstate].index(pitem) 488: for pt in propterms: 489: if pt not in la_table[pstate][inner]: 490: added_la = 1 491: la_table[pstate][inner].append(pt) 492: state_i = state_i + 1 493: if not added_la: 494: break 495: # 496: # this section just reorganizes the above data 497: # to the state it's used in later... 498: # 499: if self.verbosity>1: 500: print "done with lalr1items, reorganizing the data" 501: res = [] 502: state_i = 0 503: for state in soi: 504: item_i = 0 505: inner = [] 506: for item in state: 507: for term in la_table[state_i][item_i]: 508: if (item, term) not in inner: 509: inner.append((item, term)) 510: item_i = item_i + 1 511: inner.sort() # keeps productions in order! 512: res.append(inner) 513: state_i = state_i + 1 514: self.LALRitems = res 515: