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