diff --git a/src/node.py b/src/node.py index 7c171b3f2f9f62502e33fe33b2372132b6585f24..6371fd346d58febca42838ee0c03e34ea40464b9 100644 --- a/src/node.py +++ b/src/node.py @@ -50,7 +50,8 @@ OP_EQ = 21 OP_POSSIBILITIES = 22 OP_HINT = 23 OP_REWRITE_ALL = 24 -OP_REWRITE = 25 +OP_REWRITE_ALL_VERBOSE = 25 +OP_REWRITE = 26 # Special identifiers PI = 'pi' @@ -90,8 +91,9 @@ OP_MAP = { '=': OP_EQ, '??': OP_POSSIBILITIES, '?': OP_HINT, - '@@': OP_REWRITE_ALL, '@': OP_REWRITE, + '@@': OP_REWRITE_ALL, + '@@@': OP_REWRITE_ALL_VERBOSE, } OP_VALUE_MAP = dict([(v, k) for k, v in OP_MAP.iteritems()]) @@ -120,8 +122,9 @@ TOKEN_MAP = { OP_EQ: 'EQ', OP_POSSIBILITIES: 'POSSIBILITIES', OP_HINT: 'HINT', - OP_REWRITE_ALL: 'REWRITE_ALL', OP_REWRITE: 'REWRITE', + OP_REWRITE_ALL: 'REWRITE_ALL', + OP_REWRITE_ALL_VERBOSE: 'REWRITE_ALL_VERBOSE', } diff --git a/src/parser.py b/src/parser.py index 9ac185a5ec7942f75e3952921075b00c82357982..49e2eac82f93ff0c5250fa5542ba730d64b27a33 100644 --- a/src/parser.py +++ b/src/parser.py @@ -261,7 +261,7 @@ class Parser(BisonParser): for i, p in enumerate(self.possibilities): print '%d %s' % (i, p) - def rewrite(self, index=0): + def rewrite(self, index=0, verbose=False): self.find_possibilities() if not self.possibilities: @@ -271,26 +271,33 @@ class Parser(BisonParser): if self.verbose: print 'Applying suggestion:', suggestion + elif verbose: + print suggestion expression = apply_suggestion(self.root_node, suggestion) if self.verbose: print 'After application: ', expression + elif verbose: + print expression self.set_root_node(expression) return True - def rewrite_all(self): + def rewrite_all(self, verbose=False): i = 0 - while self.rewrite(): + while self.rewrite(verbose=verbose): i += 1 if i > 100: print 'Too many rewrite steps, aborting...' break + if not verbose: + return self.root_node + #def hook_run(self, filename, retval): # return retval @@ -331,6 +338,7 @@ class Parser(BisonParser): | REWRITE NEWLINE | REWRITE NUMBER NEWLINE | REWRITE_ALL NEWLINE + | REWRITE_ALL_VERBOSE NEWLINE | RAISE NEWLINE """ if option in (1, 2): # rule: {exp,debug} NEWLINE @@ -353,11 +361,10 @@ class Parser(BisonParser): self.rewrite(int(values[1])) return self.root_node - if option == 7: # rule: REWRITE_ALL NEWLINE - self.rewrite_all() - return self.root_node + if option in (7, 8): # rule: REWRITE_ALL NEWLINE + return self.rewrite_all(verbose=(option == 8)) - if option == 8: + if option == 9: raise RuntimeError('on_line: exception raised') def on_debug(self, target, option, names, values):