我有以下语法和测试用例:
from pyparsing import Word, nums, Forward, Suppress, OneOrMore, Group
#A grammar for a simple class of regular expressions
number = Word(nums)('number')
lparen = Suppress('(')
rparen = Suppress(')')
expression = Forward()('expression')
concatenation = Group(expression + expression)
concatenation.setResultsName('concatenation')
disjunction = Group(lparen + OneOrMore(expression + Suppress('|')) + expression + rparen)
disjunction.setResultsName('disjunction')
kleene = Group(lparen + expression + rparen + '*')
kleene.setResultsName('kleene')
expression << (number | disjunction | kleene | concatenation)
#Test a simple input
tests = """
(8)*((3|2)|2)
""".splitlines()[1:]
for t in tests:
print t
print expression.parseString(t)
print结果应该是
[['8', '*'],[['3', '2'], '2']]但是相反,我只能得到
[['8', '*']]如何让pyparsing解析整个字符串?
发布于 2017-02-11 21:03:39
您的concatenation表达式并没有做您想要的事情,而且几乎是左递归的(幸运的是,它是表达式中的最后一项)。如果你这样做,你的语法是有效的:
expression << OneOrMore(number | disjunction | kleene)通过这个更改,我得到了以下结果:
[['8', '*'], [['3', '2'], '2']]编辑:如果改用|运算符,还可以避免<<优先于<<=:
expression <<= OneOrMore(number | disjunction | kleene)发布于 2017-02-11 05:01:40
parseString有一个参数parseAll。如果您使用parseAll=True调用parseString,如果您的语法不能解析整个字符串,您将得到错误消息。从那里开始!
https://stackoverflow.com/questions/42168000
复制相似问题