java:如何实现数学解析
我正在尝试用java实现一个简单的数学解析器。这是针对我的小型学校项目,该项目使用矩阵,可以输入一些简单的方程,例如 A^-1(B+C),然后程序要求输入矩阵 A、B 和 C 并输出这些运算的结果。
到目前为止我得到的是一个名为MathParser 的类,它创建Operation 类的对象。 Operation 具有诸如 setOperation
(plus、times、inverse、power 之一)和 addInput
(Matrix|Operation|int) 等方法,最后是 executeOperation()
循环 addInput() 中的所有项目并执行 setOperation 中选定的操作。如果它发现输入中的某些项目是类操作的实例,它首先执行它 - 这是一种循环调用。它是通过这种方式来管理运算顺序的 - 乘法先于加法等。
但是,我认为这个解决方案不是很好。您对如何执行这样的任务有什么想法吗?
I am trying to implement a simple math parser in java. This is for my small school project working with matrices that enables to input some simple equations, such as A^-1(B+C) and then the program asks to input matrices A,B and C and outputs result for these operations.
What I got so far is a class called MathParser, that creates objects of class Operation.
Operation has methods like setOperation
( one of plus,times,inverse,power) and addInput
(Matrix|Operation|int) and finally executeOperation()
that loops all items from addInput() and executes chosen operation from setOperation. If it finds that some item from the input is instance of class Operation, it executes it first - this is a sort of recurrent calling. It is done this way to manage operation order - multiplying comes before addition etc.
However, I don't find this solution very good. Do you have any ideas how to implement such a task?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以考虑使用专门为数学表达式解析构建的库,例如mXparser。您将获得许多非常有用的选项:
1 - 检查表达式语法
结果:
[mXparser-v.4.0.0]
2 - 评估表达式
结果:
3 - 使用内置函数常量、运算符等。
结果:
4 - 定义自己的函数、参数和常量
结果:
5 - 标记表达式字符串并使用表达式标记
结果:
6 - 同样重要的是 - 您会在中找到更多内容 mXparser 教程、mXparser 数学集合 和 mXparser API 定义。
7 - mXparser 支持:
谨致问候
You can consider using library built specifically for math expression parsing, such as mXparser. You will get a lot of very helpful options:
1 - Checking expression syntax
Result:
[mXparser-v.4.0.0]
2 - Evaluating expression
Result:
3 - Using built-in functions constants, operators, etc..
Result:
4 - Defining your own functions, arguments and constants
Result:
5 - Tokenizing expression string and playing with expression tokens
Result:
6 - Whats equally important - you will find much more in mXparser tutorial, mXparser math collection and mXparser API definition.
7 - mXparser supports:
Best regards
我根据 Dijkstra 的 Shunting Yard 算法发布了一个表达式求值器,遵循 Apache 许可证 2.0:
http://projects.congrace.de/exp4j/index.html
i released an expression evaluator based on Dijkstra's Shunting Yard algorithm, under the terms of the Apache License 2.0:
http://projects.congrace.de/exp4j/index.html
看看 http://bracer.sourceforge.net 这是我对调车场算法的实现。
Have a look at http://bracer.sourceforge.net It's my implementation of shunting-yard algorithm.
您是否考虑过使用嵌入式脚本?
Have you considered using embedded scripting?
好吧,也许这个解决方案并不完全是您需要/想要实现的,或者可能是一种矫枉过正,但我会使用一些脚本引擎(例如 Groovy)。在这种情况下,您的代码将如下所示:
此外,您还可以解析任何复杂性的公式,甚至使用特定的计算函数。您只需将其全部放入 shell 中,然后评估输入字符串即可。
添加:
默认情况下,运算符不处理矩阵,但使用 groovy 实现它并不难,因为它支持运算符重载(在此处了解更多信息:http://groovy.codehaus.org/Operator+Overloading)
这是一个矩阵示例:
现在您的调用将如下所示:
Well, maybe this solution is not exactly what you need/want to implement or maybe it's a overkill, but I'd go with some scripting engine (for example Groovy). In that case this is how your code would look:
Moreover, you can also parse formulas of any complexity or even using your specific calculation functions. You just put it all into the shell and then evaluate the input string.
Added:
Operators do not work with matrices by default, but it is not hard to implement that with groovy as it supports operator overloading (read more about it here: http://groovy.codehaus.org/Operator+Overloading)
So here is an example with matrices:
Now in your call will look like this:
解析数学表达式的规范方法是调车场算法。这是一个非常简单而优雅的算法,实现它会教会你很多东西。
http://en.wikipedia.org/wiki/Shunting-yard_algorithm有很好的描述,并附有一个工作示例。
The canonical method for parsing mathematical expressions is the shunting yard algorithm. It is a very simple and elegant algorithm, and implementing it will teach you a lot.
http://en.wikipedia.org/wiki/Shunting-yard_algorithm has a good description, complete with a worked example.