2

我正在尝试制作一个将数学方程式传输到 Java BigDecimal 行的小工具。

例如:

A + B * C => A.add(B.multiply(C))
A / B + C => A.divide(B).add(C)

括号让事情变得很糟糕。

A - (B + C) / D => A.substract(B.add(C).divide(D))
A - (B * (C + D)) => A.substract(B.multiply(C.add(D)))

我的方法是递归地做。例如:A + B * C

1. convert( A + B * C ) 
2. A.add( convert (B * C) )
3. A.add(B.multiply(C))

支持的数学符号:+ - * / % ( )

我想知道是否有更好的方法来处理这个问题。

这种问题有名称吗?编译器?(对不起,如果不是,我从未对编译器做过任何工作。)提前致谢。

4

2 回答 2

2

您可能想查看递归下降解析器此处针对double值进行了说明。更改为BigDecimal很简单,但您可能必须缩减命名函数。

于 2013-02-08T02:38:55.940 回答
1

为什么不使用 Groovy?它直接支持更好的大十进制算术语法。

BigDecimal a = ...;
BigDecimal b = ...;
BigDecimal c = ...;
Binding binding = new Binding();
binding.setVariable("A", a);
binding.setVariable("B", b);
binding.setVariable("C", c);
GroovyShell shell = new GroovyShell(binding);

BigDecimal value = (BigDecimal) shell.evaluate("a+b*c");

如果您需要,Groovy 还具有用于大小数的直接文字语法;

A = 2G
B = 4G
C = 8G

如果您的主要目标只是输入表达式并对其求值,那么这是一个不错的简单方法。如果您尝试生成代码,那就另当别论了。

于 2013-02-08T02:39:38.267 回答