*Theoretically* more efficient (but not on the tests, it isn't.)
Cat's Eye Technologies
11 years ago
54 | 54 | self.program = program |
55 | 55 | self.scanner = scanner |
56 | 56 | self.context = Context(listeners=self.listeners) |
57 | self.prodmap = {} | |
57 | 58 | |
58 | 59 | def __repr__(self): |
59 | 60 | return "Interpreter(%r, %r, %r)" % ( |
66 | 67 | mod = prodref[1] |
67 | 68 | name = prodref[2] |
68 | 69 | if mod == '': |
69 | productions = [] | |
70 | for ast in self.program[2]: | |
71 | if ast[1] == name: | |
72 | productions.append(ast) | |
73 | if not productions: | |
70 | try: | |
71 | return self.prodmap[name] | |
72 | except KeyError: | |
74 | 73 | raise ValueError("No '%s' production defined" % name) |
75 | return productions | |
76 | 74 | elif mod == '$': |
77 | 75 | formals = { |
78 | 76 | 'expect': [Variable('X')], |
130 | 128 | """ |
131 | 129 | self.event('interpret_ast', ast) |
132 | 130 | if ast[0] == 'PROGRAM': |
131 | for prod in ast[2]: | |
132 | self.prodmap.setdefault(prod[1], []).append(prod) | |
133 | 133 | mains = self.find_productions(('PRODREF', '', 'main')) |
134 | 134 | return self.interpret(mains[0]) |
135 | 135 | elif ast[0] == 'PROD': |