【问题标题】:Building a math expression parser/evaluator?构建数学表达式解析器/评估器?
【发布时间】:2015-02-05 18:06:50
【问题描述】:

我正在尝试用 Java 构建自己的数学表达式解析器,我知道那里有很多脚本管理引擎。但我想构建自己的,只是为了参与。

但是,我一直在进步中遇到困难。所以我开始思考是否有更好的写法。这是我的做法:

(同时我假设输入是合法的) 唯一合法的运算符是:+ - * / ^ ( )

我从用户那里得到一个字符串表达式输入。然后我开始循环通过字符串输入来寻找“(”如果我找到了一个我计算其中的值然后用结果替换子表达式字符串。

我应该继续这样编程还是应该采取其他方法? 是否有任何教程解释了如何实现这一点(不是代码 - 只是一般的理论)?

如有任何帮助,我们将不胜感激。

【问题讨论】:

  • 就我个人而言,我认为自己动手是很愚蠢的,但如果你坚持,你应该看看一个有效的解析器,看看它是如何工作的,并使用你学到的东西来构建自己的解析器。我建议你看看ANTLR。这至少会教你如何编写自己的语法。 ANTLR 将根据您的语法文件生成解析器,然后您可以以多种不同的方式使用解析器。生成的解析器可能会让您了解如何自己滚动。祝你好运!
  • 这是一个很好的练习,但你应该开始只支持+ - * / - 在你拥有这部分working 之后,你可以计划如何扩展它以支持电源和括号。
  • @JNYRanger:学习从来都不是傻事,编写解析器是更好地理解编程语言的好方法。我不确定我是否会推荐阅读解析器生成器的输出;它往往对人类不友好......
  • @AasmundEldhuset 您说的完全正确,学习永远不会傻。然而,重新发明轮子往往是无用的,但如果它是出于教育目的,那么是的,它并非毫无意义。通常,我同意解析器生成器对人类不友好,但是如果您使用简单的语法(例如在 OP 的问题中),ANTLR 的输出对于生成的代码来说非常优雅
  • @JNYRanger:很有趣,我显然应该花点时间看看 ANTLR。 (当然,如果这是针对某些生产系统的,我同意解析器生成器是可行的方法,但从问题来看并不像那样。)

标签: java parsing


【解决方案1】:

您应该查看Shunting Yard Algorithm,它允许您解析包括运算符优先级和括号在内的代数表达式。

此外,您可能对 Abstract Syntax Trees 表示解析表达式的结果感兴趣,您可以在其上做进一步的工作,如漂亮地打印和评估表达式。

【讨论】:

  • 如果您这样做是为了教育,我会推荐两者,但从抽象语法树方法开始。调车场算法构建并隐含抽象语法树,当您学习时,可能更容易调试/推理您是否可以看到显式树并将其与您的预期进行比较。放入调试语句也很酷,让您可以观察正在构建的树然后使用它。
【解决方案2】:

您可能想要创建一个recursive descent parser,这是解析相当简单的语言的标准方法。从本质上讲,它是一种更结构化的方式来实现您所描述的“搜索括号并在其中评估表达式”方法。不过,请确保在开始之前熟悉递归。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多