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()