pyparsing 不解析整个字符串

pyparsing not parsing the whole string

我有以下语法和测试用例:

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 解析整个字符串?

parseString 有一个参数 parseAll。如果你用 parseAll=True 调用 parseString 如果你的语法没有解析整个字符串,你将收到错误消息。从那里开始!

您的 concatenation 表达式没有按照您的意愿行事,接近于 left-recursive(幸运的是它是您表达式中的最后一项)。如果您改为这样做,您的语法就可以工作:

expression << OneOrMore(number | disjunction | kleene)

通过此更改,我得到以下结果:

[['8', '*'], [['3', '2'], '2']]

编辑: 如果您改用 <<= 运算符,您还可以避免 << 优先于 |

expression <<= OneOrMore(number | disjunction | kleene)