2017-02-10 18 views
1

私は、連結、分離、およびkleeneの星を使って単純な正規表現文法を解析しようとしています。私の文法やテストは、次のようになります。ここでの問題は何pyparsingを使った単純な文法の解析でエラーが発生しました

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) 

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 

しかし、プログラムは非常に最初のテストに失敗しましたか?また、私の文法に関する他のフィードバック(つまり、どのようにしてもっとうまくやったのか)も高く評価されます。

答えて

2

最初のテストは"7"ではありません。 文字列が空白行で始まるため、最初のテストは""です。 ""が文法の有効な式と一致しません。

+0

[OK]を、私は、今、それは 'に失敗したことを固定(7)*'、 'トレースバック(最新の呼び出しの最後)で: ファイル "parser.py"、34行、 印刷expression.parseStringで(t) ファイル "/home/elliot/miniconda2/lib/python2.7/site-packages/pyparsing.py"、1216行目、parseString raise pyparsing.ParseException:予想されるW:(...) (char 0)、(行:1、col:1) 'となります。何か案は? –

+0

これは、式 - > kleene - > numberと一致する必要があります。 –

+0

@RenéG:問題の一部は、 'expression << number |に括弧が必要です。連結|分離| '<<'は '|'より優先度が高いため、kleene'を使用します。問題の一部は、パーサが無限に '連結 'を解析しようとしていることです。 – user2357112

関連する問題