32: #line 159 "lalr1_parser.ipk" 33: def __init__(self, prods, start,verbosity=0): 34: self.verbosity = verbosity 35: self.start = start 36: self.productions = prods[:] 37: 38: if verbosity>1: 39: for i in range(len(self.productions)): 40: print i,':',self.productions[i] 41: 42: # calculate set of symbols, nonterminals, terminals 43: # and non-terminals directly deriving epsilon 44: self.symbols = set() 45: self.nonterms = set() 46: self.epslhs = set() 47: self.lhsprods = {} 48: for p in self.productions: 49: if not self.lhsprods.has_key(p.LHS): self.lhsprods[p.LHS]=set() 50: self.lhsprods[p.LHS].insert(p) 51: self.nonterms.insert(p.LHS) 52: if len(p.RHS)==1: 53: if p.RHS[0] is EPS: self.epslhs.insert(p.LHS) 54: elif len(p.RHS)==0: self.epslhs.insert(p.LHS) 55: 56: for sym in p.RHS: 57: if sym != EPS: self.symbols.insert(sym) 58: 59: self.terms = self.symbols - self.nonterms 60: 61: if verbosity>1: 62: print 'Symbols',self.symbols 63: print 'Terminals',self.terms 64: print 'NonTerminals',self.nonterms 65: print 'Directly Derive epsilon',self.epslhs 66: 67: self.calc_lhsdereps() 68: if verbosity>1: 69: print 'Derive epsilon',self.lhsdereps 70: 71: self.calc_firstmap() 72: if verbosity>1: 73: print 'First Sets:' 74: for nt in self.firstmap.keys(): 75: print nt,'->',self.firstmap[nt] 76: 77: self.calc_followmap() 78: if verbosity>1: 79: print 'Follow Sets:' 80: for nt in self.followmap.keys(): 81: print nt,'->',self.followmap[nt] 82: 83: