Mercurial > hg > mercurial-source
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() |