Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将已声明变量的字符串(例如“x+;y”作为数学函数转换为double_Java - Fatal编程技术网

Java 将已声明变量的字符串(例如“x+;y”作为数学函数转换为double

Java 将已声明变量的字符串(例如“x+;y”作为数学函数转换为double,java,Java,我试图做的是读取一行(字符串)并将其用作数学函数,以在不同点获得(双)值或答案(基本上像计算器) 为了直截了当,我加入了一个非常简单的代码: 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); 同

我试图做的是读取一行(字符串)并将其用作数学函数,以在不同点获得(双)值或答案(基本上像计算器)

为了直截了当,我加入了一个非常简单的代码:

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


注意:正如您所看到的,我尝试了解析,但没有成功。我还尝试逐个字符读取字符串,但也不起作用,因为它将字符的值加在了一起。

我猜您正在查找a和a

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

  • lexer能够将输入(字符串)拆分为令牌
  • 解析器能够构建一棵树,它表示要进一步进行语义解释的标记的语法形状
这门学科非常广泛,我建议您从Java开始,它是一个解析器生成器,将根据您通过语法指定的规则生成lexer和parser。有很多,这只是我第一次想到


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

我猜您正在寻找一个和一个

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

  • lexer能够将输入(字符串)拆分为令牌
  • 解析器能够构建一棵树,它表示要进一步进行语义解释的标记的语法形状
这门学科非常广泛,我建议您从Java开始,它是一个解析器生成器,将根据您通过语法指定的规则生成lexer和parser。有很多,这只是我第一次想到


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

Java没有类似于
eval
的内置功能。但是你可以使用一种表达语言,比如,或者


也许这个问题可以帮助你们。

Java并没有像
eval
这样的内置代码。但是你可以使用一种表达语言,比如,或者


也许这个问题可以帮助你们。

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


此外,在Java示例中,还有。

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

此外,在Java示例中,还有。

float eval(String exp)
{
char[]a=exp.toCharArray();
float[]buffer=新整数[exp.length];
int k=0;
对于(int i:a)
{ 
如果(a[i]>=48&&a[i]
float eval(字符串exp)
{
char[]a=exp.toCharArray();
float[]buffer=新整数[exp.length];
int k=0;
对于(int i:a)
{ 

如果(a[i]>=48&&a[i]你需要为此编写一个解析器。Java没有
eval
…你需要为此编写一个解析器。Java没有
eval
…也有parboiled。parboiled也有一个工作计算器示例;)也有parboiled。parboiled也有一个工作计算器示例;)
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
}