Manual:Error Reporting:Example
まんま
>>> from lepl import * >>> class Term(Node): pass ... >>> class Factor(Node): pass ... >>> class Expression(Node): pass ... >>> expr = Delayed() >>> number = Digit()[1:,...] > 'number' >>> badChar = AnyBut(Space() | Digit() | '(')[1:,...] >>> with Separator(r'\s*'): ... unopen = number ** make_error('no ( before {stream_out}') & ')' ... unclosed = ('(' & expr & Eos()) ** make_error('no ) for {stream_in}') ... term = Or( ... (number | '(' & expr & ')') > Term, ... badChar ^ 'unexpected text: {results[0]}', ... unopen >> throw, ... unclosed >> throw ... ) ... muldiv = Any('*/') > 'operator' ... factor = (term & (muldiv & term)[:]) > Factor ... addsub = Any('+-') > 'operator' ... expr += (factor & (addsub & factor)[:]) > Expression ... line = Empty() & Trace(expr) & Eos() ... >>> parser = line.string_parser() >>> parser('1 + 2 * (3 + 4 - 5')[0] No handlers could be found for logger "lepl.trace._TraceResults" Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 249, in single return next(matcher(arg))[0] File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 182, in trampoline raise value File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 165, in trampoline value = stack[-1].throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 91, in throw return self.__generator.throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/memo.py", line 113, in generator stream)) File "str: '1 + 2 * (3 + 4 - 5'", line 1 1 + 2 * (3 + 4 - 5 ^ lepl.error.Error: no ) for (3 + 4 - 5 >>> parser('1 + 2 * 3 + 4 - 5)')[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 249, in single return next(matcher(arg))[0] File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 182, in trampoline raise value File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 165, in trampoline value = stack[-1].throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 91, in throw return self.__generator.throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/memo.py", line 113, in generator stream)) File "str: '1 + 2 * 3 + 4 - 5)'", line 1 1 + 2 * 3 + 4 - 5) ^ lepl.error.Error: no ( before ) >>> parser('1 + 2 * (3 + four - 5)')[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 249, in single return next(matcher(arg))[0] File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 182, in trampoline raise value File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 165, in trampoline value = stack[-1].throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 91, in throw return self.__generator.throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/memo.py", line 113, in generator stream)) File "str: '1 + 2 * (3 + four - 5)'", line 1 1 + 2 * (3 + four - 5) ^ lepl.error.Error: unexpected text: four >>> parser('1 + 2 ** (3 + 4 - 5)')[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 249, in single return next(matcher(arg))[0] File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 182, in trampoline raise value File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 165, in trampoline value = stack[-1].throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/parser.py", line 91, in throw return self.__generator.throw(value) File "/usr/local/Python-3.1/lib/python3.1/site-packages/lepl/memo.py", line 113, in generator stream)) File "str: '1 + 2 ** (3 + 4 - 5)'", line 1 1 + 2 ** (3 + 4 - 5) ^ lepl.error.Error: unexpected text: *