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:
43:
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: