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 是双精度且函数是字符串时,如何设置 z = function?

注意:如您所见,我尝试了 parse,但它不起作用。我也尝试逐个字符地读取字符串,但它也不起作用,因为它将字符的值加在一起。

4

4 回答 4

1

我建议你看看Parboiled。与几乎所有其他 Java 解析器解决方案不同,您编写语法......在 Java 中。

更重要的是,在 Java 示例中,还有可用的计算器

于 2013-01-05T19:01:48.040 回答
1

我猜您正在寻找lexerparser

这些是每个编译器或解释器的基本组件

  • 词法分析器能够将输入(您的字符串)拆分为标记
  • 解析器能够构建一棵树,表示您的标记的句法形状,以便在语义上进一步解释

这门学科非常广泛,我建议您从Java 的ANTLR之类的东西开始,它是一个解析器生成器,可以根据您通过语法指定的规则生成词法分析器和解析器。有很多,这只是我想到的第一个。

如果您想忘记所有这些理论,只需在您的 Java 程序中嵌入 JavaScript 或 Groovy 之类的东西,它们就能够解释在运行时给出的代码,这样您就可以这样做。

于 2013-01-05T18:50:42.700 回答
1

Java没有eval内置的东西。但是您可以为此使用spELmvelJexl等表达式语言。

也许这个SO question 可以帮助你。

于 2013-01-05T18:54:07.763 回答
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 回答