我目前正在为我正在移植作为个人项目的游戏开发一个脚本解释器 - 我在前面提出了一些问题。评估脚本解释器中的布尔表达式
它开始工作得很好,但是我确实需要评估布尔表达式,例如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.
然后我想通过后缀计算器拉出结果令牌来摆脱所有的数学运算,只留下逻辑条件。
但是,如果这是我应该采取或不采取的方法,我是在围栏。仅仅看到后缀计算会增加很多代码,我想知道是否有一些我没有想到的技巧?如果postfix的确是要走的路,我能否以某种方式使它与数学运算符一起处理逻辑条件?
我在C#中做这个,但我不愿意使用外部库或某种“Eval”函数。我对使用ANTLR之类的东西也没有兴趣,因为对于表达式解析器(如果这是它的术语),看似“简单”的东西肯定有较少侵入性的方法。
“表达式求解器”是以语法树为基础的。语法树最好通过语法从字符串派生。不使用语法几乎肯定不是最明智的解决方案,除非作为自己的学习练习。 –
@KirkWoll如果你知道如何实现简单的语法而不需要使用像ANTLR这样的库文件,我会非常乐意倾听这些可能性! –
那么,要消费一种语法,你需要使用一个库,或者你需要自己编写这个库。过去我使用过[Irony](http://irony.codeplex.com/)以取得良好效果,并且它具有的优点是您无需退出C#。 (语法是用C#本身定义的) –