2

数式をJavaBigDecimal行に転送する小さなツールを作成しようとしています。

例えば:

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

値についてここに示されている再帰降下パーサーを見たいと思うかもしれません。への変更は簡単ですが、名前付き関数を縮小する必要がある場合があります。doubleBigDecimal

于 2013-02-08T02:38:55.940 に答える
1

なぜGroovyを使わないのですか? これは、大きな 10 進演算の優れた構文を直接サポートしています。

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 に答える