如何使用pyparsing库根据表达式中的算术优先级生成括号的解析器?例如,*比+具有更高的优先级。
它应该这样做:
»> print(wholeexp.parseString('3+5-2'))
[[['3', '+', '5'], '-', '2']]
»> print(wholeexp.parseString('3+(5-2)'))
[['3', '+', ['5', '-', '2']]]
»> print(wholeexp.parseString('3+5-2*4'))
[[['3', '+', '5'], '-', ['2', '*', '4']]] 我试过以下方法,但效果不太好。我们应该如何在这里更改expr:
from pyparsing import *
numb = Word(nums)
leftpar = Suppress('(')
rightpar = Suppress(')')
expr = Forward()
expr << Or( [numb,
Group(leftpar + expr + "+" + expr + rightpar),
Group(leftpar + expr + "-" + expr + rightpar),
Group(leftpar + expr + "*" + expr + rightpar)] )
wholeexp = expr + StringEnd()发布于 2017-04-02 21:21:44
您的方法类似于这个pyparsing解析示例中使用的方法:http://pyparsing.wikispaces.com/file/view/fourFn.py。但是,最近版本的parser解析引入了operatorPrecedence,最近更名为infixNotation,您的4函数算术表达式解析器如下所示:
import pyparsing as pp
integer = pp.pyparsing_common.integer()
four_fn_arith_expr = pp.infixNotation(integer,
[
# leading sign
(pp.oneOf("+ -"), 1, pp.opAssoc.RIGHT,),
# multiplication and division
(pp.oneOf("* /"), 2, pp.opAssoc.LEFT,),
# addition and subtraction
(pp.oneOf("+ -"), 2, pp.opAssoc.LEFT,),
])下面是使用此解析器运行的测试用例:
tests = """
3+5-2
3+(5-2)
3+5--2
3+5-2*4
"""
four_fn_arith_expr.runTests(tests, fullDump=False)给予:
3+5-2
[[3, '+', 5, '-', 2]]
3+(5-2)
[[3, '+', [5, '-', 2]]]
3+5--2
[[3, '+', 5, '-', ['-', 2]]]
3+5-2*4
[[3, '+', 5, '-', [2, '*', 4]]]发布于 2017-03-31 17:30:58
这篇文章看起来很有希望:Python中简单的自顶向下解析我知道它有很多,但是滚动到“精简令牌类生成”部分的底部,您将看到它在运行中。我个人无法让它工作,因为一个错误:AttributeError: 'generator' object has no attribute 'next',但我很确定这与python3.0中的下一个方法发生了更改有关。对我来说,这段代码很复杂,我很难理解和解决这个问题,但你可能会有更好的运气。
编辑:只要在python2.7中运行它,它就能工作了。您既可以在较旧版本的python中运行它,也可以遍历代码并尝试修复它。
https://stackoverflow.com/questions/43146123
复制相似问题