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: *