Show More
@@ -40,7 +40,9 b' elements = {' | |||||
40 | "end": (0, None, None, None, None), |
|
40 | "end": (0, None, None, None, None), | |
41 | } |
|
41 | } | |
42 |
|
42 | |||
43 | def tokenize(program, start, end): |
|
43 | def tokenize(program, start, end, term=None): | |
|
44 | """Parse a template expression into a stream of tokens, which must end | |||
|
45 | with term if specified""" | |||
44 | pos = start |
|
46 | pos = start | |
45 | while pos < end: |
|
47 | while pos < end: | |
46 | c = program[pos] |
|
48 | c = program[pos] | |
@@ -127,13 +129,15 b' def tokenize(program, start, end):' | |||||
127 | sym = program[s:pos] |
|
129 | sym = program[s:pos] | |
128 | yield ('symbol', sym, s) |
|
130 | yield ('symbol', sym, s) | |
129 | pos -= 1 |
|
131 | pos -= 1 | |
130 |
elif c == |
|
132 | elif c == term: | |
131 | yield ('end', None, pos + 1) |
|
133 | yield ('end', None, pos + 1) | |
132 | return |
|
134 | return | |
133 | else: |
|
135 | else: | |
134 | raise error.ParseError(_("syntax error"), pos) |
|
136 | raise error.ParseError(_("syntax error"), pos) | |
135 | pos += 1 |
|
137 | pos += 1 | |
136 | raise error.ParseError(_("unterminated template expansion"), start) |
|
138 | if term: | |
|
139 | raise error.ParseError(_("unterminated template expansion"), start) | |||
|
140 | yield ('end', None, pos) | |||
137 |
|
141 | |||
138 | def _parsetemplate(tmpl, start, stop, quote=''): |
|
142 | def _parsetemplate(tmpl, start, stop, quote=''): | |
139 | r""" |
|
143 | r""" | |
@@ -171,7 +175,7 b' def _parsetemplate(tmpl, start, stop, qu' | |||||
171 | if c == quote: |
|
175 | if c == quote: | |
172 | return parsed, n + 1 |
|
176 | return parsed, n + 1 | |
173 |
|
177 | |||
174 | parseres, pos = p.parse(tokenize(tmpl, n + 1, stop)) |
|
178 | parseres, pos = p.parse(tokenize(tmpl, n + 1, stop, '}')) | |
175 | parsed.append(parseres) |
|
179 | parsed.append(parseres) | |
176 |
|
180 | |||
177 | if quote: |
|
181 | if quote: | |
@@ -218,6 +222,28 b' def parse(tmpl):' | |||||
218 | assert pos == len(tmpl), 'unquoted template should be consumed' |
|
222 | assert pos == len(tmpl), 'unquoted template should be consumed' | |
219 | return _unnesttemplatelist(('template', parsed)) |
|
223 | return _unnesttemplatelist(('template', parsed)) | |
220 |
|
224 | |||
|
225 | def _parseexpr(expr): | |||
|
226 | """Parse a template expression into tree | |||
|
227 | ||||
|
228 | >>> _parseexpr('"foo"') | |||
|
229 | ('string', 'foo') | |||
|
230 | >>> _parseexpr('foo(bar)') | |||
|
231 | ('func', ('symbol', 'foo'), ('symbol', 'bar')) | |||
|
232 | >>> _parseexpr('foo(') | |||
|
233 | Traceback (most recent call last): | |||
|
234 | ... | |||
|
235 | ParseError: ('not a prefix: end', 4) | |||
|
236 | >>> _parseexpr('"foo" "bar"') | |||
|
237 | Traceback (most recent call last): | |||
|
238 | ... | |||
|
239 | ParseError: ('invalid token', 7) | |||
|
240 | """ | |||
|
241 | p = parser.parser(elements) | |||
|
242 | tree, pos = p.parse(tokenize(expr, 0, len(expr))) | |||
|
243 | if pos != len(expr): | |||
|
244 | raise error.ParseError(_('invalid token'), pos) | |||
|
245 | return _unnesttemplatelist(tree) | |||
|
246 | ||||
221 | def prettyformat(tree): |
|
247 | def prettyformat(tree): | |
222 | return parser.prettyformat(tree, ('integer', 'string', 'symbol')) |
|
248 | return parser.prettyformat(tree, ('integer', 'string', 'symbol')) | |
223 |
|
249 |
General Comments 0
You need to be logged in to leave comments.
Login now