首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据算术优先级设置括号的Python解析器

根据算术优先级设置括号的Python解析器
EN

Stack Overflow用户
提问于 2017-03-31 17:04:20
回答 2查看 469关注 0票数 2

如何使用pyparsing库根据表达式中的算术优先级生成括号的解析器?例如,*+具有更高的优先级。

它应该这样做:

代码语言:javascript
运行
复制
»> 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

代码语言:javascript
运行
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2017-04-02 21:21:44

您的方法类似于这个pyparsing解析示例中使用的方法:http://pyparsing.wikispaces.com/file/view/fourFn.py。但是,最近版本的parser解析引入了operatorPrecedence,最近更名为infixNotation,您的4函数算术表达式解析器如下所示:

代码语言:javascript
运行
复制
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,),
                                    ])

下面是使用此解析器运行的测试用例:

代码语言:javascript
运行
复制
tests = """
    3+5-2
    3+(5-2)
    3+5--2
    3+5-2*4
    """
four_fn_arith_expr.runTests(tests, fullDump=False)

给予:

代码语言:javascript
运行
复制
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]]]
票数 1
EN

Stack Overflow用户

发布于 2017-03-31 17:30:58

这篇文章看起来很有希望:Python中简单的自顶向下解析我知道它有很多,但是滚动到“精简令牌类生成”部分的底部,您将看到它在运行中。我个人无法让它工作,因为一个错误:AttributeError: 'generator' object has no attribute 'next',但我很确定这与python3.0中的下一个方法发生了更改有关。对我来说,这段代码很复杂,我很难理解和解决这个问题,但你可能会有更好的运气。

编辑:只要在python2.7中运行它,它就能工作了。您既可以在较旧版本的python中运行它,也可以遍历代码并尝试修复它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43146123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档