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

如何扩展后缀/前缀表示法以支持任意参数函数?含算法咨询

带函数调用的表达式转后缀式方法及算法获取解答

一、带函数调用的表达式转后缀式的标准算法

扩展**调度场算法(Shunting-yard Algorithm)**就能支持带任意参数函数的表达式转后缀式,这是处理这类场景的标准方案,核心扩展点如下:

  • 识别函数标记:当扫描到标识符(比如funone)后紧跟(时,判定为函数,将其压入运算符栈,并标记为函数类型(与普通加减乘除运算符区分开)。
  • 处理参数分隔符,:遇到逗号时,持续弹出栈中元素到输出队列,直到遇到对应的左括号(为止,以此分割不同参数的后缀式,保证参数顺序正确。
  • 处理函数结束符):遇到右括号时,弹出栈中元素到输出队列,直到匹配到对应的左括号;若此时栈顶是函数名,将函数名弹出到输出队列(作为函数调用的操作符),最后弹出左括号(不加入输出队列)。

以你给出的表达式funone(funtwo(3), 2) * 2为例,转换后的后缀式为:3 funtwo 2 funone 2 *,转换步骤如下:

  1. 扫描到funone,后续是(,判定为函数,压入栈。
  2. 扫描到funtwo,后续是(,压入栈。
  3. 扫描到3,直接加入输出队列 → 队列:3
  4. 扫描到),弹出栈顶的funtwo到队列,再弹出( → 队列:3 funtwo
  5. 扫描到,,弹出栈中元素直到(,此时栈顶为(,停止操作。
  6. 扫描到2,加入输出队列 → 队列:3 funtwo 2
  7. 扫描到),弹出栈顶的funone到队列,再弹出( → 队列:3 funtwo 2 funone
  8. 扫描到*,栈为空,压入栈。
  9. 扫描到2,加入输出队列 → 队列:3 funtwo 2 funone 2
  10. 表达式扫描结束,弹出栈中的*到队列,得到最终后缀式。

二、Raphael Graf的ActionScript表达式解析器算法获取途径

  • 直接阅读expr-eval库的源码:该库基于原ActionScript解析器改写,核心逻辑完全保留,你可以查看库的源代码来提取算法细节。
  • 查找原链接的存档快照:通过网页存档服务搜索原链接的历史版本,有可能找到原解析器的文档或完整代码。
  • 参考同类开源实现:多数表达式解析器都基于调度场算法,比如math.js的解析模块、ANTLR的表达式示例实现,这些代码的核心逻辑与原解析器一致,可作为参考。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:28