You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pyparsing的infixNotation中正确定义函数语法?

解决pyparsing递归函数语法定义问题

你遇到的核心问题是错误地将逗号当作独立运算符处理,实际上逗号只是函数参数的分隔符,不能直接加入infixNotation的运算符列表。正确的做法是单独定义函数调用结构,结合递归表达式处理嵌套调用:

修正后的代码实现

import pyparsing as pp

test_string = "f(x, g(h(i,j)))"

# 定义递归表达式的Forward占位符
expr = pp.Forward()

# 匹配单个变量(字母组成的标识符)
variable = pp.Word(pp.alphas)

# 定义函数调用结构:函数名 + 括号包裹的逗号分隔参数列表
function_call = pp.Group(
    pp.Word(pp.alphas) 
    + pp.Suppress("(") 
    + pp.delimitedList(expr) 
    + pp.Suppress(")")
)

# 原子表达式:变量或函数调用(递归的基础单元)
atom = variable | function_call

# 若需支持加减乘除等运算符,可通过infixNotation扩展
# 此处先仅处理变量与函数调用场景
term = atom
expr <<= term

# 测试解析结果
result = expr.parse_string(test_string)
print(result.dump())

关键说明

  • 用pp.delimitedList(expr)专门处理括号内的逗号分隔参数,确保逗号仅在函数参数场景下被识别,不会误判独立变量
  • function_call用pp.Group包裹,可让解析结果的层级结构更清晰,便于后续业务处理
  • 如需添加其他运算符(如加减乘除),只需在infixNotation中补充优先级规则,示例如下:
term = pp.infixNotation(
    atom,
    [
        (pp.oneOf("* /"), 2, pp.opAssoc.LEFT),  # 乘除优先级更高
        (pp.oneOf("+ -"), 2, pp.opAssoc.LEFT),  # 加减优先级次之
    ]
)
expr <<= term

修改后即可正确解析混合运算符与嵌套函数的表达式,例如f(x*2 + y, g(h(i-j, k)))

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:20:11