Я пытаюсь разобрать простую грамматику регулярного выражения с конкатенацией, дизъюнкцией и звездой клине. Моя грамматика и тесты выглядеть следующим образом:Ошибка в разборе простой грамматики с pyparsing
from pyparsing import Word, nums, Forward, Suppress, OneOrMore
#A grammar for a simple class of regular expressions
number = Word(nums)('number')
lparen = Suppress('(')
rparen = Suppress(')')
expression = Forward()('expression')
concatenation = expression + expression
concatenation.setResultsName('concatenation')
disjunction = lparen + OneOrMore(expression + Suppress('|')) + expression + rparen
disjunction.setResultsName('disjunction')
kleene = lparen + expression + rparen + Suppress('*')
kleene.setResultsName('kleene')
expression << number | concatenation | disjunction | kleene
#Test a simple input
tests = """
7
23
(7)*
(45)*
(1|2|3)
((2)*|3)
((0|1))*
""".splitlines()
for t in tests:
print t
print expression.parseString(t)
print
Однако программа не на самом первом тесте:
Traceback (most recent call last):
File "main.py", line 34, in <module>
print expression.parseString(t)
File "/home/elliot/miniconda2/lib/python2.7/site-packages/pyparsing.py", line 1216, in parseString
raise exc
pyparsing.ParseException: Expected W:(0123...) (at char 0), (line:1, col:1)
Что здесь проблема? Также будет оценена любая другая обратная связь по моей грамматике (то есть, как я мог бы сделать что-то лучше/проще).
Хорошо, я установил, что, но теперь он не будет работать на '(7) *' с 'TraceBack (самый последний вызов последнего): Файл "parser.py", строка 34, в печати expression.parseString (t) Файл «/home/elliot/miniconda2/lib/python2.7/site-packages/pyparsing.py», строка 1216, в parseString raise exc pyparsing.ParseException: ожидается W: (...) (при char 0), (строка: 1, col: 1) '. Есть идеи? –
Он должен соответствовать выражению -> kleene -> number –
@ RenéG: Часть проблемы состоит в том, что вам нужны скобки в 'expression << number | конкатенация | дизъюнкция | kleene', так как '<<' имеет более высокий приоритет, чем '|'. Частично проблема заключается в том, что ваш синтаксический анализатор будет бесконечно пытаться проанализировать «конкатенацию». – user2357112