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
しかし、プログラムは非常に最初のテストに失敗しましたか?また、私の文法に関する他のフィードバック(つまり、どのようにしてもっとうまくやったのか)も高く評価されます。
[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) 'となります。何か案は? –
これは、式 - > kleene - > numberと一致する必要があります。 –
@RenéG:問題の一部は、 'expression << number |に括弧が必要です。連結|分離| '<<'は '|'より優先度が高いため、kleene'を使用します。問題の一部は、パーサが無限に '連結 'を解析しようとしていることです。 – user2357112