comparison mercurial/parser.py @ 26377:42ac9d1d1572

parser: reorder infix/suffix handling to be similar to prefix/primary flow It can be exactly the same flow as the prefix/primary handling. A suffix action is accepted only if the next token never starts new term.
author Yuya Nishihara <yuya@tcha.org>
date Mon, 06 Jul 2015 21:55:55 +0900 (2015-07-06)
parents 43a8a87fc175
children 455190fb4e51
comparison
equal deleted inserted replaced
26376:43a8a87fc175 26377:42ac9d1d1572
58 else: 58 else:
59 raise error.ParseError(_("not a prefix: %s") % token, pos) 59 raise error.ParseError(_("not a prefix: %s") % token, pos)
60 # gather tokens until we meet a lower binding strength 60 # gather tokens until we meet a lower binding strength
61 while bind < self._elements[self.current[0]][0]: 61 while bind < self._elements[self.current[0]][0]:
62 token, value, pos = self._advance() 62 token, value, pos = self._advance()
63 # handle infix rules, take as suffix if unambiguous
63 infix, suffix = self._elements[token][3:] 64 infix, suffix = self._elements[token][3:]
64 # check for suffix - next token isn't a valid prefix
65 if suffix and not self._hasnewterm(): 65 if suffix and not self._hasnewterm():
66 expr = (suffix[0], expr) 66 expr = (suffix[0], expr)
67 elif infix:
68 expr = (infix[0], expr, self._parseoperand(*infix[1:]))
67 else: 69 else:
68 # handle infix rules 70 raise error.ParseError(_("not an infix: %s") % token, pos)
69 if not infix:
70 raise error.ParseError(_("not an infix: %s") % token, pos)
71 expr = (infix[0], expr, self._parseoperand(*infix[1:]))
72 return expr 71 return expr
73 def parse(self, tokeniter): 72 def parse(self, tokeniter):
74 'generate a parse tree from tokens' 73 'generate a parse tree from tokens'
75 self._iter = tokeniter 74 self._iter = tokeniter
76 self._advance() 75 self._advance()