如何扩展后缀/前缀表示法以支持任意参数函数?含算法咨询
带函数调用的表达式转后缀式方法及算法获取解答
一、带函数调用的表达式转后缀式的标准算法
扩展**调度场算法(Shunting-yard Algorithm)**就能支持带任意参数函数的表达式转后缀式,这是处理这类场景的标准方案,核心扩展点如下:
- 识别函数标记:当扫描到标识符(比如
funone)后紧跟(时,判定为函数,将其压入运算符栈,并标记为函数类型(与普通加减乘除运算符区分开)。 - 处理参数分隔符
,:遇到逗号时,持续弹出栈中元素到输出队列,直到遇到对应的左括号(为止,以此分割不同参数的后缀式,保证参数顺序正确。 - 处理函数结束符
):遇到右括号时,弹出栈中元素到输出队列,直到匹配到对应的左括号;若此时栈顶是函数名,将函数名弹出到输出队列(作为函数调用的操作符),最后弹出左括号(不加入输出队列)。
以你给出的表达式funone(funtwo(3), 2) * 2为例,转换后的后缀式为:3 funtwo 2 funone 2 *,转换步骤如下:
- 扫描到
funone,后续是(,判定为函数,压入栈。 - 扫描到
funtwo,后续是(,压入栈。 - 扫描到
3,直接加入输出队列 → 队列:3 - 扫描到
),弹出栈顶的funtwo到队列,再弹出(→ 队列:3 funtwo - 扫描到
,,弹出栈中元素直到(,此时栈顶为(,停止操作。 - 扫描到
2,加入输出队列 → 队列:3 funtwo 2 - 扫描到
),弹出栈顶的funone到队列,再弹出(→ 队列:3 funtwo 2 funone - 扫描到
*,栈为空,压入栈。 - 扫描到
2,加入输出队列 → 队列:3 funtwo 2 funone 2 - 表达式扫描结束,弹出栈中的
*到队列,得到最终后缀式。
二、Raphael Graf的ActionScript表达式解析器算法获取途径
- 直接阅读expr-eval库的源码:该库基于原ActionScript解析器改写,核心逻辑完全保留,你可以查看库的源代码来提取算法细节。
- 查找原链接的存档快照:通过网页存档服务搜索原链接的历史版本,有可能找到原解析器的文档或完整代码。
- 参考同类开源实现:多数表达式解析器都基于调度场算法,比如math.js的解析模块、ANTLR的表达式示例实现,这些代码的核心逻辑与原解析器一致,可作为参考。
内容的提问来源于stack exchange,提问作者srilakshmikanthanp
相关产品推荐
相关产品推荐

