数学解析器的智能设计?
时间:2020-03-06 14:32:16 来源:igfitidea点击:
设计数学解析器的最明智的方法是什么?我的意思是说一个函数需要一个数学字符串(例如:" 2 + 3/2 +(2 * 5)")并返回计算出的值?我确实在VB6时代就写过一篇文章,但最终导致它变得肿且不太便于携带(或者对此很聪明...)。一般的想法,伪代码或者实代码表示赞赏。
解决方案
一个很好的方法将涉及两个步骤。第一步涉及将表达式从中缀转换为后缀(例如通过Dijkstra的调车场)表示法。一旦完成,编写一个postfix评估器就很简单了。
我们有几种方法。我们可以生成动态代码并执行它以获取答案,而无需编写太多代码。只需在.NET中运行时生成的代码上执行搜索,周围就会有很多示例。
或者,我们可以创建一个实际的解析器并生成一个小的解析树,然后将其用于评估表达式。同样,对于基本表达式而言,这非常简单。签出Codeplex,因为我相信他们那里有一个数学解析器。或者只是查找包含示例的BNF。任何介绍编译器概念的网站都将以此为基本示例。
Codeplex表达评估器
假设输入是字符串格式的中缀表达式,则可以将其转换为后缀,并使用一对堆栈:运算符堆栈和操作数堆栈,从那里开始解决方案。我们可以在Wikipedia链接中找到常规算法信息。
如果我们有一个" always on"应用程序,只需将数学字符串发布到google并解析结果即可。简单的方法,但不确定那是否是我们所需要的,但我想有些聪明。
相关问题优先级方程式(表达式)解析器?以及如何入门方面也有一些很好的信息。
-亚当
我写了一些有关设计数学解析器的博客文章。这里有一个通用的介绍,有关语法的基本知识,用Ruby编写的示例实现和一个测试套件。也许我们会发现这些材料很有用。
ANTLR是一个非常不错的LL(*)解析器生成器。我强烈推荐。