我目前正在为一个我正在移植作为个人项目的游戏开发一个脚本解释器 - 我之前已经提出过几个问题。
它开始工作得很好,但我确实已经到了必须评估布尔表达式的地步,例如while-loops,if-statements等等。
我当前的代码对脚本进行了标记,并在遇到一个时将布尔表达式传递给一个名为ProcessExpression(string[] tokens)
的函数。示例令牌数组可以是:
local.i
<=
local.arrayLength
+
1
&&
(
local.i
<
local.notThis
||
local.i
>
local.notThis
)
考虑如何处理实际评估,我想我首先用实际值替换变量,例如:local.i
将变为0,local.arrayLength
将变为16和{{1会变成10。
然后我考虑通过后缀计算器拉出结果标记来摆脱所有数学运算,只留下逻辑条件。
然而,如果这是我应该采取或不采取的方法,我就会陷入困境。单独看后缀计算会增加很多代码,我想知道是否有一些我没想过的技巧?如果postfix确实是要走的路,我能否以某种方式让它与数学运算符一起处理逻辑条件?
我在C#中创建它,但我不愿意使用外部库或某种“Eval”函数。我也对使用像ANTLR这样的东西制作语法不感兴趣,因为必须有一些不那么具有干扰性的方法来表达作为表达式解算器看似“简单”的东西(如果那就是它的术语)。
答案 0 :(得分:0)
所以,回答我自己的问题:我最终使用了后缀计算器方法。
我将所有令牌传递给我的ExpressionSolver
类,这会将它从Infix转换为Postfix,然后评估Postfix。运算符列表还包含&&
和||
运算符,并在遇到它们时对其进行相应处理。
我还最终制作了一个简单的基于正则表达式的词法分析器,用于在Kirk Woll说完之后对我的输入进行标记。它确实使我解析之前我实际上更容易解决一个表达式,我使用了以下资源(也见我的评论):Poor man's "lexer" for C#