parser: resolve ambiguity where both prefix and primary actions are defined
authorYuya Nishihara <yuya@tcha.org>
Sun, 05 Jul 2015 12:09:27 +0900
changeset 25816 43a8a87fc175
parent 25815 e71e5629e006
child 25817 42ac9d1d1572
parser: resolve ambiguity where both prefix and primary actions are defined If both actions are defined, a primary-expression action is accepted only if the next token never starts new term. For example, parsed as primary expression: ":" # next token 'end' has no action "(:)" # next token ')' has no action ":+y" # next token '+' is infix operator parsed as prefix operator: ":y" # next token 'y' is primary expression ":-y" # next token '-' is prefix operator This is mostly the same resolution as the infix/suffix rules.
mercurial/parser.py
--- a/mercurial/parser.py	Sun Jul 05 12:02:13 2015 +0900
+++ b/mercurial/parser.py	Sun Jul 05 12:09:27 2015 +0900
@@ -49,9 +49,9 @@
         return expr
     def _parse(self, bind=0):
         token, value, pos = self._advance()
-        # handle prefix rules on current token
+        # handle prefix rules on current token, take as primary if unambiguous
         primary, prefix = self._elements[token][1:3]
-        if primary:
+        if primary and not (prefix and self._hasnewterm()):
             expr = (primary, value)
         elif prefix:
             expr = (prefix[0], self._parseoperand(*prefix[1:]))