我目前正在为我作为个人项目移植的游戏开发脚本解释器——我之前已经问过一些关于它的问题。
它开始工作得很好,但是我确实到了必须评估布尔表达式的地步,例如 while 循环、if 语句等中的表达式。
我当前的代码对脚本进行标记,并将布尔表达式传递给ProcessExpression(string[] tokens)
遇到一个时调用的函数。一个示例令牌数组可以是:
local.i
<=
local.arrayLength
+
1
&&
(
local.i
<
local.notThis
||
local.i
>
local.notThis
)
考虑如何处理实际评估,我想我会先用实际值替换变量,例如:local.i
会变成 0,local.arrayLength
会变成 16,然后local.notThis
会变成 10。
然后我考虑通过后缀计算器提取结果标记以摆脱所有数学,只留下逻辑条件。
但是,如果这是我应该采取的方法,我有点犹豫不决。看到单独的后缀计算会添加很多代码,我想知道是否有一些我没有想到的技巧?如果后缀确实是要走的路,我能否以某种方式让它与数学运算符一起处理逻辑条件?
我在 C# 中做这个,但是我不愿意使用外部库或某种“Eval”函数。我也对使用诸如 ANTLR 之类的东西为此制定语法不感兴趣,因为对于作为表达式求解器的看似“简单”的东西(如果这是它的术语),必须有较少侵入性的方法。