2017-02-10 5 views
1

Я пытаюсь разобрать простую грамматику регулярного выражения с конкатенацией, дизъюнкцией и звездой клине. Моя грамматика и тесты выглядеть следующим образом:Ошибка в разборе простой грамматики с 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) 

Что здесь проблема? Также будет оценена любая другая обратная связь по моей грамматике (то есть, как я мог бы сделать что-то лучше/проще).

ответ

2

Первый тест не "7". Первый тест - "", потому что строка tests начинается с пустой строки. "" не соответствует допустимому выражению в вашей грамматике.

+0

Хорошо, я установил, что, но теперь он не будет работать на '(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) '. Есть идеи? –

+0

Он должен соответствовать выражению -> kleene -> number –

+0

@ RenéG: Часть проблемы состоит в том, что вам нужны скобки в 'expression << number | конкатенация | дизъюнкция | kleene', так как '<<' имеет более высокий приоритет, чем '|'. Частично проблема заключается в том, что ваш синтаксический анализатор будет бесконечно пытаться проанализировать «конкатенацию». – user2357112

 Смежные вопросы

  • Нет связанных вопросов^_^