1

我目前正在为我作为个人项目移植的游戏开发脚本解释器——我之前已经问过一些关于它的问题。

它开始工作得很好,但是我确实到了必须评估布尔表达式的地步,例如 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 之类的东西为此制定语法不感兴趣,因为对于作为表达式求解器的看似“简单”的东西(如果这是它的术语),必须有较少侵入性的方法。

4

1 回答 1

0

所以,回答我自己的问题:我最终使用了后缀计算器方法。

我将所有令牌传递给我的ExpressionSolver班级,这会将其从 Infix 转换为 Postfix,然后评估 Postfix。operator-list 还包含&&and||运算符,并在遇到它们时相应地处理它们。

在 Kirk Woll 所说的之后,我还最终制作了一个简单的基于正则表达式的词法分析器来标记我的输入。在我真正解决表达式之前,它确实使我的解析变得更加容易,我为此使用了以下资源(另请参阅我的评论):Poor man's "lexer" for C#

于 2013-10-09T22:41:49.453 回答