2012-08-29 30 views
1

我见过不少表达式解析器/,可以采取一定的串并评估结果断词的语句。例如,你可以泵串:动态评估与多个运营商的平等

4+4 

到下面的代码:

MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl(); 
//' You always need to initialize a language engine 
sc.Language = "VBScript"; 
//' this is the expression - in a real program it will probably be 
//' read from a textbox control 
string expr = "4+4"; 
double res = sc.Eval(expr); 

,并得到8但是,有一个分析工具,有可以评估字符串:

4 = 4 = 4 

?到目前为止,所有示例都失败了,因为无法比较double和boolean(从编译器的角度来看有意义,但从人的角度来看,我们可以看到这是真的)。任何人都会遇到可以实现这个目标

回答

2

从人的角度来看,如果我们认为X = Y = Z作为一种特殊的运营商(三个操作数),它意味着X = Y,Y,这是唯一真正= z,x = z。这是表达式的特定语法解释。一个人(尤其是程序员)也可以解释它以同样的方式大多数编译器做的,这是选择最左边的分组(X = Y),然后比较这比较(一个布尔值)到Z的结果。即使对人来说,在这种语法下这也没有意义。从人类的角度来看,这似乎是显而易见的,因为人们在选择对某个给定的上下文来说“有意义”的句法时出了名。

如果你真的想要这个级别的模糊性,你需要看看类似Wolfram Alpha的东西,它执行上下文分析以试图找到表达式的最佳猜测。如果您在那里输入'4 = 4 = 4',它将回复“真”。

+0

+1 - 同一时间/同一点:) –

0

尝试

var result = (int) HtmlPage.Window.Eval("4 + 4"); 
+0

OP已经可以得到它。你的代码是否为'4 = 4 = 4'返回'true'? –

1

您需要定义语法为你的“语言”,并建立解析器你预期的行为是不正常的表达式语法覆盖(也是正常的语言应该评估为“假”,因为每个听说器具的语言=二进制操作,因此将在某个时刻以“4 =真”结束)。有工具来构建C#语法分析器...

边注:匹配“人的角度”是出奇的难问题,即使是人与人通信仍然没有解决:)。