gpt4 book ai didi

python - PyParsing 中的简单递归下降

转载 作者:IT老高 更新时间:2023-10-28 21:08:03 25 4
gpt4 key购买 nike

我试过服用this code并将其转换为我正在从事的用于编程语言处理的项目,但我遇到了简化版本的问题:

op = oneOf( '+ - / *')
lparen, rparen = Literal('('), Literal(')')

expr = Forward()
expr << ( Word(nums) | ( expr + op + expr ) | ( lparen + expr + rparen) )

我已经对这个简单的设置进行了许多不同的修改。通常,尝试类似:

print(expr.parseString('1+2'))

将返回 ['1']。当我陷入深度递归中时,例如:

print(expr.parseString('(1+2)'))

对于我无法解析任意算术表达式的简单递归,我缺少什么,例如 1+(2 * 3-(4*(5+6)-(7))... ?

最佳答案

哇,我猜 pyparsing 真的在 map 上!感谢 Alex 和 John 介入这个问题。你们的回答都对标。但是让我添加一两条评论:

  1. 如果我们抑制左括号和右括号符号,并使用 Group 对带括号的表达式进行分组,pyparsing 将得到更接近 AST 的结构化结果。

    from pyparsing import Literal,Word,ZeroOrMore,Forward,nums,oneOf,Group

    def Syntax():
    op = oneOf('+ -')
    lpar = Literal( '(' ).suppress()
    rpar = Literal( ')' ).suppress()
    num = Word(nums)
    expr = Forward()
    atom = num | Group(lpar + expr + rpar)
    expr << atom + ZeroOrMore(op + atom)
    return expr

    if __name__ == "__main__":
    expr = Syntax()
    def test(s):
    results = expr.parseString(s)
    print s,'->', results

    test( "(9 + 3)" )
    test( "(9 + 3) * (4 / 5)" )

    给予:

    (9 + 3) -> [['9', '+', '3']]
    (9 + 3) * (4 / 5) -> [['9', '+', '3'], '*', ['4', '/', '5']]

    否则,pyparsing 只是标记化,您必须遍历已解析标记的列表才能找到嵌套表达式。

  2. 由于 op 仅定义为 oneOf("+ - */"),因此没有操作的优先级。在 https://github.com/pyparsing/pyparsing/tree/master/examples 的 pyparsing 存储库中有示例手动定义此方法 (fourFn.py),或使用 infixNotation 帮助程序 (simpleArith.py) 的更新方法。同样,这让 pyparsing 增加了比标记化更多的值(value)。

对于 OP,请查看这些示例,我认为它们将帮助您推进您的项目。

-- 保罗

关于python - PyParsing 中的简单递归下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1345039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com