基本上,这些表达式只包含变量、逻辑运算符(或、与、蕴含、等价、否定)和括号。
我想问一下,实现这种解析器的最佳方式是什么(使用AST树还是逆波兰表示法)?或者已经存在一些开源解析器可以完成这项工作吗?
你的目标语言是什么?
如果你想创建一个解析器,也许ANTLR适合你。它最初是基于Java的,但它有多种语言的生成器(例如我用它来生成C#解析器),并且不太难掌握。 它有一个很好的编辑器(ANTLRWorks),可以测试语法,这是一个不错的优点。
你看过http://ncalc.codeplex.com吗?
它是可扩展的,快速的(例如具有自己的缓存),通过处理EvaluateFunction / EvaluateParameter事件,可以在运行时提供自定义函数和变量。它可以解析的示例表达式:
Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");
e.Parameters["Pi2"] = new Expression("Pi * Pi"); e.Parameters["X"] = 10;
e.EvaluateParameter += delegate(string name, ParameterArgs args) { if (name == "Pi") args.Result = 3.14; };
Debug.Assert(117.07 == e.Evaluate()); 它还原生地处理Unicode和许多数据类型。如果您想更改语法,则附带Antler文件。还有一个支持MEF加载新功能的分支。
听起来像是一道作业 :-)
首先,您需要递归地定义您的语言。
如果X是一个良好形式(WFF),那么变量就是良好形式(WFF)
如果X和Y是WFF,则(X -> Y)是WFF
如果X和Y是WFF,则(X AND Y)是WFF
一旦定义了语法,请使用LEX或Flex或Java等等价物编写简单扫描器。
使用YACC或Bison或等效物编写后代递归解析器。
稍后,为了以后以递归方式评估表达式,添加属性到语法中。