diff -r cc741c76b26a -r b3004d273874 mercurial/parser.py --- a/mercurial/parser.py Sun Jul 05 17:50:35 2015 +0900 +++ b/mercurial/parser.py Sun Jul 05 18:09:15 2015 +0900 @@ -35,6 +35,15 @@ raise error.ParseError(_("unexpected token: %s") % self.current[0], self.current[2]) self._advance() + def _parseoperand(self, bind, m=None): + 'gather right-hand-side operand until an end condition or binding met' + if m and self.current[0] == m: + expr = None + else: + expr = self._parse(bind) + if m: + self._match(m) + return expr def _parse(self, bind=0): token, value, pos = self._advance() # handle prefix rules on current token @@ -44,13 +53,7 @@ if len(prefix) == 1: expr = (prefix[0], value) else: - if len(prefix) > 2 and prefix[2] == self.current[0]: - self._match(prefix[2]) - expr = (prefix[0], None) - else: - expr = (prefix[0], self._parse(prefix[1])) - if len(prefix) > 2: - self._match(prefix[2]) + expr = (prefix[0], self._parseoperand(*prefix[1:])) # gather tokens until we meet a lower binding strength while bind < self._elements[self.current[0]][0]: token, value, pos = self._advance() @@ -62,13 +65,7 @@ # handle infix rules if not infix: raise error.ParseError(_("not an infix: %s") % token, pos) - if len(infix) == 3 and infix[2] == self.current[0]: - self._match(infix[2]) - expr = (infix[0], expr, (None)) - else: - expr = (infix[0], expr, self._parse(infix[1])) - if len(infix) == 3: - self._match(infix[2]) + expr = (infix[0], expr, self._parseoperand(*infix[1:])) return expr def parse(self, tokeniter): 'generate a parse tree from tokens'