在脚本解释器中计算布尔表达式

本文关键字:计算 布尔表达式 解释器 脚本 | 更新日期: 2023-09-27 18:34:03

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

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

在脚本解释器中计算布尔表达式

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

我将所有令牌传递给我的ExpressionSolver类,这会将其从中缀转换为后缀,然后评估后缀。运算符列表还包含&&运算符和||运算符,并在遇到它们时相应地处理它们。

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