pyparsing没有解析整个字符串

时间:2017-02-10 20:19:11

标签: pyparsing

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

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

你的concatenation表达式没有做你想要的,接近于左递归(幸运的是它是你表达式中的最后一个术语)。如果您这样做,您的语法就会起作用:

expression << OneOrMore(number | disjunction | kleene)

有了这个改变,我得到了这个结果:

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

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

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