Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/parser.py @ 11278:7df88cdf47fd
revset: add support for prefix and suffix versions of : and ::
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Wed, 02 Jun 2010 14:07:46 -0500 |
parents | 77272d28b53f |
children | 4215ce511134 |
comparison
equal
deleted
inserted
replaced
11277:2698a95f3f1b | 11278:7df88cdf47fd |
---|---|
21 self._elements = elements | 21 self._elements = elements |
22 self._methods = methods | 22 self._methods = methods |
23 def _advance(self): | 23 def _advance(self): |
24 'advance the tokenizer' | 24 'advance the tokenizer' |
25 t = self.current | 25 t = self.current |
26 self.current = self._iter.next() | 26 try: |
27 self.current = self._iter.next() | |
28 except StopIteration: | |
29 pass | |
27 return t | 30 return t |
28 def _match(self, m): | 31 def _match(self, m): |
29 'make sure the tokenizer matches an end condition' | 32 'make sure the tokenizer matches an end condition' |
30 if self.current[0] != m: | 33 if self.current[0] != m: |
31 raise SyntaxError(self.current) | 34 raise SyntaxError(self.current) |
47 if len(prefix) > 2: | 50 if len(prefix) > 2: |
48 self._match(prefix[2]) | 51 self._match(prefix[2]) |
49 # gather tokens until we meet a lower binding strength | 52 # gather tokens until we meet a lower binding strength |
50 while bind < self._elements[self.current[0]][0]: | 53 while bind < self._elements[self.current[0]][0]: |
51 token, value = self._advance() | 54 token, value = self._advance() |
52 # handle infix rules | 55 e = self._elements[token] |
53 infix = self._elements[token][2] | 56 # check for suffix - next token isn't a valid prefix |
54 if len(infix) == 3 and infix[2] == self.current[0]: | 57 if len(e) == 4 and not self._elements[self.current[0]][1]: |
55 self._match(infix[2]) | 58 suffix = e[3] |
56 expr = (infix[0], expr, (None)) | 59 expr = (suffix[0], expr) |
57 else: | 60 else: |
58 if not infix[0]: | 61 # handle infix rules |
59 raise SyntaxError("not an infix") | 62 infix = self._elements[token][2] |
60 expr = (infix[0], expr, self._parse(infix[1])) | 63 if len(infix) == 3 and infix[2] == self.current[0]: |
61 if len(infix) == 3: | |
62 self._match(infix[2]) | 64 self._match(infix[2]) |
65 expr = (infix[0], expr, (None)) | |
66 else: | |
67 if not infix[0]: | |
68 raise SyntaxError("not an infix") | |
69 expr = (infix[0], expr, self._parse(infix[1])) | |
70 if len(infix) == 3: | |
71 self._match(infix[2]) | |
63 return expr | 72 return expr |
64 def parse(self, message): | 73 def parse(self, message): |
65 'generate a parse tree from a message' | 74 'generate a parse tree from a message' |
66 self._iter = self._tokenizer(message) | 75 self._iter = self._tokenizer(message) |
67 self.current = self._iter.next() | 76 self.current = self._iter.next() |