mathparsing器的智能devise?
devisemathparsing器的最明智的方法是什么? 我的意思是一个函数,需要一个mathstring(如:“2 + 3/2 +(2 * 5)”)并返回计算的值? 我曾经在VB6中写过一篇文章,但是最终却变得臃肿起来,而不是很便携(或者说聪明的事情)。 一般的想法,伪代码或真正的代码表示赞赏。
一个相当好的方法将涉及两个步骤。 第一步涉及将expression式从中缀转换为后缀 (例如通过Dijkstra的分stream码 )表示法。 一旦完成,编写一个后缀评估器是相当简单的。
我写了几篇关于devisemathparsing器的博文。 有一个大致的介绍 ,关于语法的基本知识, 用Ruby编写的示例实现和testing套件 。 也许你会发现这些材料很有用。
你有几个办法。 您可以生成dynamic代码并执行它,以便无需编写大量代码即可获得答案。 只需在.NET中执行search运行时生成的代码,并且有很多例子。
或者,您可以创build一个实际的parsing器,然后生成一个用于评估expression式的小parsing树。 再次,这对基本expression式来说非常简单。 看看codeplex,因为我相信他们有一个mathparsing器。 或者只是查找包含示例的BNF。 任何介绍编译器概念的网站都会将其作为一个基本的例子。
Codeplexexpression式评估器
如果你有一个“永远在线”的应用程序,只需发送mathstring谷歌和parsing结果。 简单的方法,但不知道,如果这是你所需要的 – 但聪明的某种方式,我猜。
相关问题具有优先级的等式(expression式)parsing器? 有一些关于如何开始这个好信息。
-亚当
我知道这是旧的,但我遇到了这个尝试开发一个计算器作为一个更大的应用程序的一部分,并使用接受的答案碰到一些问题。 这些链接非常有助于理解和解决这个问题,不应该打折扣。 我正在Java中编写一个Android应用程序,并且为expression式“string”中的每个项目写入一个string,当用户在键盘上键入时,我实际上将一个string存储在一个ArrayList中。 对于中缀到后缀的转换,我迭代了ArrayList中的每个String,然后评估新安排的Strings的后缀ArrayList。 对于less数操作数/操作符来说,这是非常棒的,但是更长的计算一直是closures的,特别是当expression式开始计算为非整数时。 在提供的Infix到Postfix转换的链接中,如果扫描的项目是一个操作符,并且topStack项目具有较高的优先级,则build议popup堆栈。 我发现这几乎是正确的。 如果优先级高于或等于扫描的运算符,则popuptopStack项目,最终使我的计算结果正确。 希望这能帮助解决这个问题的人,并感谢Justin Poliey(和fas?)提供了一些宝贵的链接。
假设你的input是一个string格式的中缀expression式,你可以将它转换为后缀,并使用一对堆栈:一个操作堆栈和一个操作堆栈,从那里工作。 您可以在Wikipedia链接find一般的algorithm信息。
ANTLR是一个非常好的LL(*)parsing器生成器。 我高度推荐它。
开发人员总是希望有一个干净的方法,并尝试从头开始实施parsing逻辑,通常以Dijkstra调车 – 堆场algorithm结束 。 结果是整洁的代码,但可能充满了bug。 我已经开发了这样一个API, JMEP ,但是花了我好几年才有稳定的代码。
即使是所有这些工作,甚至在完成所有工作之后,甚至可以从该项目页面看到我正在认真考虑切换到使用JavaCC或ANTLR。