gpt4 book ai didi

java - 将用户输入的字符串转换为表达式

转载 作者:行者123 更新时间:2023-12-01 15:22:50 26 4
gpt4 key购买 nike

所以我花了一天的大部分时间在 Google 和 StackExchange 上寻找答案或指导,但我已经放弃了。我必须问以下问题:

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

t>>7|t|t>>6

假设它被存储为字符串。我想要的是将这个字符串转换为一个表达式,其中 t 成为变量,>>| 成为运算符。基本上我想弄清楚如何实现这个http://www.redcode.nl/blog/2011/12/bytebeat-algorithmic-symphonies/但以某种方式将用户输入传递给 private static int f(int t) 而不是对表达式进行硬编码。

我已经阅读了一些有关 ScriptEngineManager 和使用 JavaScript 的内容,但我不知道这是否是正确的方法。

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

最佳答案

您可以使用 javassist 库来完成此操作。从 http://sourceforge.net/projects/jboss/files/Javassist/3.16.1-GA/ 下载该库并将其添加到您的项目。

//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)));
}

在这里,我们使用用户提供的表达式动态生成一个方法,并使用 Javassist 将其添加到 ExpressionEvaluator 类中。

希望有帮助。

关于java - 将用户输入的字符串转换为表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com