0

私がやろうとしているのは、行(文字列)を読み取り、それを数学関数として使用して、さまざまなポイントで値または回答を取得することです(基本的に電卓のように)

直接的かつ簡単にするために、私がやろうとしていることの非常に単純化されたコードを含めました。

double x, y, z;
String function;

x = 5;
y = 4;
function = "(x*y)+y";

z = Double.parseDouble(function);

/*
I want z to equal this
z = (x*y)+y;
*/
System.out.print("z= " + z);

繰り返しますが、これは私の質問をより明確にするためのサンプル コードにすぎません。私の質問は次のとおりです: z が double で関数が文字列の場合、どうすれば z = function を設定できますか?

注:ご覧のとおり、解析を試みましたが、うまくいきませんでした。また、文字列を文字単位で読み取ろうとしましたが、文字の値を一緒に追加したため、どちらも機能しませんでした。

4

4 に答える 4

1

lexerparserを探していると思います。

これらは、すべてのコンパイラまたはインタープリタの基本コンポーネントです。

  • レクサーは入力(文字列)をトークンに分割できます
  • パーサーは、トークンの構文形状を表すツリーを構築して、さらに意味的に解釈することができます

この規律は非常に広いので、 ANTLR for Java のようなものから始めることをお勧めします。これは、文法で指定したルールに従ってレクサーとパーサーの両方を生成するパーサー ジェネレーターです。たくさんありますが、これは私の頭に浮かんだ最初のものです。

JavaScript や Groovy などを Java プログラムに埋め込むだけで、このすべての理論を忘れたい場合は、実行時に与えられたコードを解釈できるので、そのまま実行できます。

于 2013-01-05T18:50:42.700 に答える
1

evalJavaには組み込みのようなものはありません。ただし、これには spEL 、 mvelJexlなどの式言語を使用できます。

たぶん、このSOの質問が役に立ちます。

于 2013-01-05T18:54:07.763 に答える
1

Parboiledをご覧になることをお勧めします。Java 用の他のほとんどすべてのパーサー ソリューションとは異なり、文法は Java で記述します。

さらに、Java の例の中には、実用的な電卓もあります。

于 2013-01-05T19:01:48.040 に答える
0
float eval(String exp)
{
    char[] a = exp.toCharArray();
    float[] buffer = new int[exp.length];
    int k = 0;
    for(int i : a)
    { 
        if(a[i] >= 48 && a[i] <= 57) //checking for numbers
        {
             int x = a[i] - '0';
             buffer[k++] = x;
        }
        else if(a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/') //checking for operands
        {
             float result;
             switch(a[i])
             {
                  case '+': result = buffer[k] + buffer[k-1]; break;       
                  case '-': result = buffer[k] - buffer[k-1]; break;
                  case '*': result = buffer[k] * buffer[k-1]; break; 
                  case '/': result = buffer[k] / buffer[k-1]; break;               
             }
        }
        buffer[k++] = result;
    }
    return buffer[k]; //finally returning the recent value
}

このような方法を使用します。大いに役立ちます。スタック データ構造を使用して実装されます。

于 2013-01-05T19:05:26.003 に答える