6.9.3.6. Calculate LALR1items

6.9.3.6. Calculate LALR1items

Start python section to interscript/parsers/lalr1.py[18]
   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: 
End python section to interscript/parsers/lalr1.py[18]