逻辑表达式解析器

时间:2009-05-05 20:12:10

标签: parsing logic expression

我正在尝试为以下表达式创建逻辑表达式解析器: ((VariableA - > VariableB)AND NOT VariableC) 对于给定的变量值,解析器应该能够返回结果是true还是false。

基本上,表达式只包含变量,逻辑运算符(或者,含义,等价,否定和括号)。

我想问一下实现这种解析器的最佳方法是什么(使用AST树或反向波兰表示法)?或者可能已经存在一些可以完成这项工作的开源解析器?

6 个答案:

答案 0 :(得分:2)

您定位的语言是什么?

如果你想创建一个解析器,也许ANTLR可以帮到你。它最初是基于java的,但它有各种语言的生成器(我用它来生成一个C#解析器),并且不太难以接收。 它有一个很好的编辑器(ANTLRWorks),允许测试语法,这是一个很好的加号。

答案 1 :(得分:1)

如果我是你,我会使用RPN。这应该可以在解析时节省一些麻烦,并且算法应该像操作符进入时推送和弹出一堆值一样简单。你也不必愚弄括号,这会让生活更轻松。唯一真正的缺点是大多数人不熟悉postfix(AKA RPN)表示法。

堆栈也可能比树更容易使用。

只是我的2¢:)

答案 2 :(得分:0)

我确信已有工具可以执行此操作(逻辑评估),但我找不到任何工具。如果您使用Bison(YACC,对于C)或ANTLR(生成多种语言,但使用Java)等工具,则不必担心解析。 Coco/R是另一个可以生成许多不同语言的解析器生成器。如果你想自己做,我会使用RPN或前缀表示法(我认为它比RPN简单)。这将使解析变得更加简单,但会使用户烦恼。

答案 3 :(得分:0)

听起来像是作业: - )

首先,你必须递归地定义你的语言。

变量是格式良好的形式(WFF)

如果X是WFF,那么X不是WFF

如果X和Y是WFF,则(X - > Y)是WFF

如果X和Y是WFF则(X和Y是)WFF

定义语法后,使用LEX或Flex或Java等效语法 或者你喜欢用来写一个简单的扫描仪的语言。

使用YACC或Bison或等效函数编写后代递归解析器。

稍后将语法添加到语法中,以便以后代递归方式评估要评估的表达式。

答案 4 :(得分:0)

如果您使用的是Python,请尝试使用this expression parser/evaluator编写的pyparsing作为起点。

答案 5 :(得分:0)

你见过http://ncalc.codeplex.com吗?

它是可扩展的,快速的(例如有自己的缓存)使您能够通过处理EvaluateFunction / EvaluateParameter事件在运行时提供自定义函数和变量。它可以解析的示例表达式:

表达式e =新表达式(“Round(Pow(Pi,2)+ Pow([Pi2],2)+ X,2)”);

e.Parameters [“Pi2”] =新表达式(“Pi * Pi”);   e.Parameters [“X”] = 10;

e.EvaluateParameter + = delegate(字符串名称,ParameterArgs args)     {       if(name ==“Pi”)       args.Result = 3.14;     };

Debug.Assert(117.07 == e.Evaluate()); 它还处理unicode和amp;许多数据类型原生。如果你想改变语法,它会附带一个鹿茸文件。还有一个支持MEF加载新功能的fork。