我目前正在根据以下条件实现表达式评估器(单行表达式,如公式):
- 输入的表达式被标记化以分隔文字布尔值,整数,小数,字符串,函数,标识符(变量)
- 我实现了Shunting-yard算法(经过微调以处理具有可变数量的参数的函数)以消除括号并以后缀顺序将运算符以适当的优先级排序
- 我的调车场只是产生了一个(模拟的)令牌队列(通过数组,我的Powerbuilder Classic语言可以定义对象,但只有动态数组作为本机存储-不是真实列表,没有字典),我使用简单堆垛机
我的评估人员工作得很好,但我仍然缺少if()
,我想知道如何进行。
使用分流后缀和基于堆栈的评估,如果我添加if()
具有真假部分的另一个函数,则单个if(true, msgbox("ok"), msgbox("not ok"))
消息将显示两条消息,而我只希望显示一条消息。这是因为当我需要评估一个函数时,它的所有参数都已经被评估并放置在堆栈中。
您能给我一些if()
偷懒实现的方法吗?
我虽然将它们作为一种宏进行处理,但是在早期我还没有条件评估。也许我需要使用队列以外的其他结构来分别保存条件和true / false表达式?目前,表达式在评估之前已被解析,但我还计划将中间表示形式存储为一种预编译的表达式,以供将来评估之用。
编辑:经过一些问题后,我认为我可以构建表达式的树表示形式(AST而不是线性令牌流),从中我可以轻松地忽略自己的一个或另一个分支if()
。