mercurial/parser.py
changeset 11319 9d1cf337a78d
parent 11305 d4cafcb63f77
child 11412 51ceb1571805
equal deleted inserted replaced
11318:7d780c04f074 11319:9d1cf337a78d
    28         try:
    28         try:
    29             self.current = self._iter.next()
    29             self.current = self._iter.next()
    30         except StopIteration:
    30         except StopIteration:
    31             pass
    31             pass
    32         return t
    32         return t
    33     def _match(self, m):
    33     def _match(self, m, pos):
    34         'make sure the tokenizer matches an end condition'
    34         'make sure the tokenizer matches an end condition'
    35         if self.current[0] != m:
    35         if self.current[0] != m:
    36             raise error.ParseError("unexpected token: %s" % self.current[0],
    36             raise error.ParseError("unexpected token: %s" % self.current[0],
    37                                    self.current[2])
    37                                    self.current[2])
    38         self._advance()
    38         self._advance()
    44             raise error.ParseError("not a prefix: %s" % token, pos)
    44             raise error.ParseError("not a prefix: %s" % token, pos)
    45         if len(prefix) == 1:
    45         if len(prefix) == 1:
    46             expr = (prefix[0], value)
    46             expr = (prefix[0], value)
    47         else:
    47         else:
    48             if len(prefix) > 2 and prefix[2] == self.current[0]:
    48             if len(prefix) > 2 and prefix[2] == self.current[0]:
    49                 self._match(prefix[2])
    49                 self._match(prefix[2], pos)
    50                 expr = (prefix[0], None)
    50                 expr = (prefix[0], None)
    51             else:
    51             else:
    52                 expr = (prefix[0], self._parse(prefix[1]))
    52                 expr = (prefix[0], self._parse(prefix[1]))
    53                 if len(prefix) > 2:
    53                 if len(prefix) > 2:
    54                     self._match(prefix[2])
    54                     self._match(prefix[2], pos)
    55         # gather tokens until we meet a lower binding strength
    55         # gather tokens until we meet a lower binding strength
    56         while bind < self._elements[self.current[0]][0]:
    56         while bind < self._elements[self.current[0]][0]:
    57             token, value, pos = self._advance()
    57             token, value, pos = self._advance()
    58             e = self._elements[token]
    58             e = self._elements[token]
    59             # check for suffix - next token isn't a valid prefix
    59             # check for suffix - next token isn't a valid prefix
    62                 expr = (suffix[0], expr)
    62                 expr = (suffix[0], expr)
    63             else:
    63             else:
    64                 # handle infix rules
    64                 # handle infix rules
    65                 infix = self._elements[token][2]
    65                 infix = self._elements[token][2]
    66                 if len(infix) == 3 and infix[2] == self.current[0]:
    66                 if len(infix) == 3 and infix[2] == self.current[0]:
    67                     self._match(infix[2])
    67                     self._match(infix[2], pos)
    68                     expr = (infix[0], expr, (None))
    68                     expr = (infix[0], expr, (None))
    69                 else:
    69                 else:
    70                     if not infix[0]:
    70                     if not infix[0]:
    71                         raise error.ParseError("not an infix: %s" % token, pos)
    71                         raise error.ParseError("not an infix: %s" % token, pos)
    72                     expr = (infix[0], expr, self._parse(infix[1]))
    72                     expr = (infix[0], expr, self._parse(infix[1]))
    73                     if len(infix) == 3:
    73                     if len(infix) == 3:
    74                         self._match(infix[2])
    74                         self._match(infix[2], pos)
    75         return expr
    75         return expr
    76     def parse(self, message):
    76     def parse(self, message):
    77         'generate a parse tree from a message'
    77         'generate a parse tree from a message'
    78         self._iter = self._tokenizer(message)
    78         self._iter = self._tokenizer(message)
    79         self.current = self._iter.next()
    79         self.current = self._iter.next()