【发布时间】:2015-02-05 18:06:50
【问题描述】:
我正在尝试用 Java 构建自己的数学表达式解析器,我知道那里有很多脚本管理引擎。但我想构建自己的,只是为了参与。
但是,我一直在进步中遇到困难。所以我开始思考是否有更好的写法。这是我的做法:
(同时我假设输入是合法的) 唯一合法的运算符是:+ - * / ^ ( )
我从用户那里得到一个字符串表达式输入。然后我开始循环通过字符串输入来寻找“(”如果我找到了一个我计算其中的值然后用结果替换子表达式字符串。
我应该继续这样编程还是应该采取其他方法? 是否有任何教程解释了如何实现这一点(不是代码 - 只是一般的理论)?
如有任何帮助,我们将不胜感激。
【问题讨论】:
-
就我个人而言,我认为自己动手是很愚蠢的,但如果你坚持,你应该看看一个有效的解析器,看看它是如何工作的,并使用你学到的东西来构建自己的解析器。我建议你看看ANTLR。这至少会教你如何编写自己的语法。 ANTLR 将根据您的语法文件生成解析器,然后您可以以多种不同的方式使用解析器。生成的解析器可能会让您了解如何自己滚动。祝你好运!
-
这是一个很好的练习,但你应该开始只支持
+ - * /- 在你拥有这部分working 之后,你可以计划如何扩展它以支持电源和括号。 -
@JNYRanger:学习从来都不是傻事,编写解析器是更好地理解编程语言的好方法。我不确定我是否会推荐阅读解析器生成器的输出;它往往对人类不友好......
-
@AasmundEldhuset 您说的完全正确,学习永远不会傻。然而,重新发明轮子往往是无用的,但如果它是出于教育目的,那么是的,它并非毫无意义。通常,我同意解析器生成器对人类不友好,但是如果您使用简单的语法(例如在 OP 的问题中),ANTLR 的输出对于生成的代码来说非常优雅
-
@JNYRanger:很有趣,我显然应该花点时间看看 ANTLR。 (当然,如果这是针对某些生产系统的,我同意解析器生成器是可行的方法,但从问题来看并不像那样。)