Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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 将字符串从用户输入转换为表达式_Java - Fatal编程技术网

Java 将字符串从用户输入转换为表达式

Java 将字符串从用户输入转换为表达式,java,Java,所以我花了一天的大部分时间在谷歌上搜索和交换答案或指导,我已经放弃了。我要问: 我想制作一个Java应用程序,要求用户输入类似以下内容的表达式: t>>7|t|t>>6 让我们假设它随后存储为字符串。我想把这个字符串转换成一个表达式,t变成一个变量,>和|变成操作符。基本上,我想弄清楚如何实现这一点,但以某种方式将用户输入传递给私有静态intf(intt),而不是硬编码表达式 我已经读了一些关于ScriptEngineManager和使用JavaScript的书,但我不

所以我花了一天的大部分时间在谷歌上搜索和交换答案或指导,我已经放弃了。我要问:

我想制作一个Java应用程序,要求用户输入类似以下内容的表达式:

t>>7|t|t>>6
让我们假设它随后存储为字符串。我想把这个字符串转换成一个表达式,
t
变成一个变量,
>
|
变成操作符。基本上,我想弄清楚如何实现这一点,但以某种方式将用户输入传递给
私有静态intf(intt)
,而不是硬编码表达式

我已经读了一些关于ScriptEngineManager和使用JavaScript的书,但我不知道这是否是一条路


无论如何,这只是为了个人教育和娱乐。提前谢谢。

听起来像是语言识别工作。你试过了吗。据我所知,它用于solr、hibernate等中的复杂解析。

您可以使用javassist库来实现这一点。从下载该库并将其添加到项目中

//ExpressionEvaluator.java

public class ExpressionEvaluator {

}
//AudioPump.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Loader;
import javassist.NotFoundException;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

public class AudioPump {

    private static String expression;

    public static void main(String[] args) throws Exception {
        System.out.print("Enter expression(use t as variable):");
        BufferedReader consoleReader = new BufferedReader(
                new InputStreamReader(System.in));
        expression = consoleReader.readLine();
        generateMethod(expression);
        AudioFormat format = new AudioFormat(8000f, 8, 1, false, false);
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
        SourceDataLine soundLine = (SourceDataLine) AudioSystem.getLine(info);
        soundLine.open(format, 32000);
        soundLine.start();

        byte[] buffer = new byte[8];
        int t = 0;

        while (true) {
            for (int n = 0; n < buffer.length; n++) {
                buffer[n] = (byte) invokeF(t++);
            }
            soundLine.write(buffer, 0, buffer.length);
        }
    }

    private static byte invokeF(int i) {
        java.lang.reflect.Method method = null;
        try {
            ClassPool pool = ClassPool.getDefault();
            Loader cl = new Loader(pool);
            Class expressionEvaluatorClass = cl.loadClass("ExpressionEvaluator");
            method = expressionEvaluatorClass.getMethod("f", Integer.TYPE);
        } catch (SecurityException e) {
            e.printStackTrace();System.exit(-1);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();System.exit(-1);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();System.exit(-1);
        }
        try {
            return (Byte) method.invoke(null, i);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();System.exit(-1);
        } catch (IllegalAccessException e) {
            e.printStackTrace();System.exit(-1);
        } catch (InvocationTargetException e) {
            e.printStackTrace();System.exit(-1);
        }
        return 0;
    }

    private static void generateMethod(String expression2) {
        ClassPool pool = ClassPool.getDefault();
        try {
            CtClass pt = pool.get("ExpressionEvaluator");
            String methodString = "public static byte f(int t) { return (byte)(" + expression2 + ");}";
            System.out.println(methodString);
            CtMethod m = CtNewMethod.make(methodString, pt);
            pt.addMethod(m);
            pt.writeFile();
        } catch (NotFoundException e) {
            e.printStackTrace();System.exit(-1);
        } catch (CannotCompileException e) {
            e.printStackTrace();System.exit(-1);
        } catch (IOException e) {
            e.printStackTrace();System.exit(-1);
        }
    }

    // return (t*(t>>5|t>>8))>>(t>>16);
    // return t*(((t>>12)|(t>>8))&(63&(t>>4)));
}
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.lang.reflect.InvocationTargetException;
导入javassist.CannotCompileException;
导入javassist.ClassPool;
导入javassist.CtClass;
导入javassist.CtMethod;
导入javassist.CtNewMethod;
导入javassist.Loader;
导入javassist.NotFoundException;
导入javax.sound.sampled.AudioFormat;
导入javax.sound.sampled.AudioSystem;
导入javax.sound.sampled.DataLine;
导入javax.sound.sampled.SourceDataLine;
公共级音频泵{
私有静态字符串表达式;
公共静态void main(字符串[]args)引发异常{
System.out.print(“输入表达式(使用t作为变量):”;
BufferedReader控制台Reader=新BufferedReader(
新的InputStreamReader(System.in));
expression=consolerereader.readLine();
生成法(表达法);
AudioFormat格式=新的AudioFormat(8000f,8,1,false,false);
DataLine.Info=newdataline.Info(SourceDataLine.class,格式);
SourceDataLine soundLine=(SourceDataLine)AudioSystem.getLine(info);
声音线。打开(格式,32000);
soundLine.start();
字节[]缓冲区=新字节[8];
int t=0;
while(true){
for(int n=0;n>5 | t>>8))>>(t>>16);
//返回t*((t>>12)|(t>>8))和(63&(t>>4));
}
这里,我们使用用户提供的表达式动态生成一个方法,并使用Javassist将其添加到ExpressionEvaluator类中


希望有帮助。

这个表达式有多复杂?链接的代码非常简单-一个变量(在循环中递增),或者加上一些正确的位移位。理想情况下,表达式可以是用户希望的长度,但复杂度方面只有一个变量
t
,任意数量的整数,和所有运算符,包括bit-wise。您可以使用JavaScript计算表达式,为执行环境提供了一个当前绑定,用于
t
-是的,应该可以。(我不太熟悉如何处理JS中的位移位)您应该看看一些数学表达式解析器。基本上是一样的,而且有很多。这也是一个大学类型的学生作业,简单的作业就在那里。@Roberto:快速阅读一篇文章表明JavaScript没有整数数据类型,所以可能无法进行位移位(
numeric
似乎是浮点)。(回答太晚了吗?)太好了。我会调查的,我想我应该一边研究反思。