如果我有一个公式:
A = 2+3*5-6/3+2
如何将公式建立为带节点的树,然后我可以从下到上,从左到右轻松地根据树计算结果。
有人请提供所需解析器或一些参考文献的样本吗?
答案 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 Generator和LEX and YACC。
如果你真的想自己动手,那里有很多资源。 GOLD Parsing System页面实际上已经有很多关于它的信息:
等
答案 2 :(得分:2)
如果它是简单的数学表达式,那么一种方法是将其转换为反向抛光表示法。在这种表示法中,计算表达式非常容易,因为表示“线性化”树(进入堆栈)。然后真正的任务解析和转换为RPN表示法(实际上非常容易)。
[http://en.wikipedia.org/wiki/Reverse_Polish_notation#Example]
过去使用RPN的旧计算器因为计算起来容易得多。