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.

然后我想通过后缀计算器拉出结果令牌来摆脱所有的数学运算,只留下逻辑条件。

但是,如果这是我应该采取或不采取的方法,我是在围栏。仅仅看到后缀计算会增加很多代码,我想知道是否有一些我没有想到的技巧?如果postfix的确是要走的路,我能否以某种方式使它与数学运算符一起处理逻辑条件?

我在C#中做这个,但我不愿意使用外部库或某种“Eval”函数。我对使用ANTLR之类的东西也没有兴趣,因为对于表达式解析器(如果这是它的术语),看似“简单”的东西肯定有较少侵入性的方法。

+0

“表达式求解器”是以语法树为基础的。语法树最好通过语法从字符串派生。不使用语法几乎肯定不是最明智的解决方案,除非作为自己的学习练习。 –

+0

@KirkWoll如果你知道如何实现简单的语法而不需要使用像ANTLR这样的库文件,我会非常乐意倾听这些可能性! –

+0

那么,要消费一种语法,你需要使用一个库,或者你需要自己编写这个库。过去我使用过[Irony](http://irony.codeplex.com/)以取得良好效果,并且它具有的优点是您无需退出C#。 (语法是用C#本身定义的) –

回答

0

因此,回答我自己的问题:我最终使用了一个后缀计算器的方法。

我将所有的令牌传递给我的ExpressionSolver类,这会将其从Infix转换为Postfix,然后评估Postfix。操作员列表还包含&&||操作员,并在遇到时相应处理它们。

我也结束了一个简单的基于正则表达式的词法分析器,用于在柯克沃尔说过之后对我的输入进行标记。在我真正开始解析表达式之前,它确实使我的解析更容易,我使用了以下资源(请参阅我的评论):Poor man's "lexer" for C#