如何解析公式以在C#中构建树?

时间:2011-01-14 00:05:37

标签: c# lexical-analysis

如果我有一个公式:

A = 2+3*5-6/3+2

如何将公式建立为带节点的树,然后我可以从下到上,从左到右轻松地根据树计算结果。

有人请提供所需解析器或一些参考文献的样本吗?

3 个答案:

答案 0 :(得分:3)

解析有许多可能的策略。

如果您想自己编写解析代码,那么一个好的策略是Recursive descent parser。这并不难,因为我为C#语言编写了自己的一个。

如果你想使用一个解析器生成器工具,你可以使用传统的GNU flex / bison组合,或google用于“C#解析器生成器”来找到一个C#,这样你就不必用C语言编写了。会产生LALR parser

答案 1 :(得分:2)

如果只是算术,you can leverage javascript within C# to "eval" the string。如果你想构建一个合适的解析器,你需要创建一个语法,从该语法生成​​一个解析器,然后构建一个解释器来处理解析器的输出。 GOLD Parsing System对此任务非常有帮助,并且.NET engines, including C#。其他选项包括ANTLR Parser GeneratorLEX and YACC

如果你真的想自己动手,那里有很多资源。 GOLD Parsing System页面实际上已经有很多关于它的信息:

答案 2 :(得分:2)

如果它是简单的数学表达式,那么一种方法是将其转换为反向抛光表示法。在这种表示法中,计算表达式非常容易,因为表示“线性化”树(进入堆栈)。然后真正的任务解析和转换为RPN表示法(实际上非​​常容易)。

[http://en.wikipedia.org/wiki/Reverse_Polish_notation#Example]

过去使用RPN的旧计算器因为计算起来容易得多。