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)
我有以下语法和测试用例:
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)