需要帮助,开发基于Java的脚本语言?
我刚刚开始研究一种叫做XScript的编程语言。它的设计使我可以从Java应用程序运行它,也可以通过Java应用程序重新编程。我的想法是,我可以在游戏中创建虚拟计算机,或者创建一个随着时间的推移自行开发的程序。到目前为止,我有以下代码。我知道由于专有软件的原因,可能需要对名称进行修改,但目前还可以 主要类别:需要帮助,开发基于Java的脚本语言?,java,programming-languages,Java,Programming Languages,我刚刚开始研究一种叫做XScript的编程语言。它的设计使我可以从Java应用程序运行它,也可以通过Java应用程序重新编程。我的想法是,我可以在游戏中创建虚拟计算机,或者创建一个随着时间的推移自行开发的程序。到目前为止,我有以下代码。我知道由于专有软件的原因,可能需要对名称进行修改,但目前还可以 主要类别: import com.x.lang.XLoader; public class Main { public static void main(String[] args) {
import com.x.lang.XLoader;
public class Main {
public static void main(String[] args) {
XLoader xl = new XLoader();
xl.exec("/Users/Nathan/Desktop/XScript/test.xls");
}
}
XLoader(加载并执行XScript):
存储语言键函数的XCommandHub:
package com.x.lang;
import com.x.lang.keyword.Print;
import com.x.lang.keyword.Set;
import com.x.lang.object.XCommand;
import com.x.lang.object.XObject;
public class XCommandHub {
public XCommand xc[] = new XCommand[2];
public XCommandHub(XObject x) {
xc[0] = new Print(x);
xc[1] = new Set(x);
}
public XCommand getCommand(String s) {
for (int i = 0; i < 2; i++) {
if (xc[i].getCommandName() == s) {
return xc[i];
}
}
return null;
}
}
定义所有变量的XVar类:
package com.x.lang.object;
public class XVar {
private String var1;
public String name;
public XVar(String s) {
var1 = s;
}
public String getStringValue() {
if (this.var1 != null) {
return var1;
}
return " ";
}
public int getIntValue() {
if (this.var1 != null) {
return Integer.parseInt(var1);
}
return 0;
}
public void setName(String s) {
name = s;
}
}
实际执行命令的XObject类:
package com.x.lang.object;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import com.x.lang.XCommandHub;
public class XObject {
public XVar xvars[] = new XVar[150];
public int varCount = 0;
public File f;
XCommandHub x;
public XObject (File file) {
f = file;
x = new XCommandHub(this);
}
public void addVar(XVar var, String name) {
xvars[varCount] = var;
xvars[varCount].setName(name);
varCount++;
}
public XVar getVar(String varName) {
for (int i = 0; i < varCount; i++) {
if (xvars[i].name == varName) {
return xvars[i];
}
}
return null;
}
public void exec() {
try (BufferedReader br = new BufferedReader(new FileReader(f))) {
String sCurrentLine;
while ((sCurrentLine = br.readLine()) != null) {
for (int i = 0; i < 2; i++) {
if (sCurrentLine.startsWith(x.xc[i].getCommandName()))
try {
x.getCommand(x.xc[i].getCommandName()).exec(new XVar(sCurrentLine.split(": ")[1]));
} catch (ArrayIndexOutOfBoundsException e) {
x.getCommand(x.xc[i].getCommandName()).exec(new XVar(" "));
}
}
}
}
catch (IOException e) {
e.printStackTrace();
}
}
}
根据我目前编写的程序,我试图让用户能够打印他们在代码中声明的变量。basic.xls(X语言脚本)可能如下所示:
set: x=Hello StackOverflow
print: This was programmed in XScript!
print:
print: %x
但是,当我尝试从数组中检索变量x时,print类中存在NullPointerException。程序返回“%x”而不是“Hello StackOverflow”,因为我故意捕获了异常,但是我不知道它最初是如何发生的
谢谢
Doctor\N您的代码将永远找不到它要查找的变量:
public XVar getVar(String varName) {
for (int i = 0; i < varCount; i++) {
if (xvars[i].name == varName) {
return xvars[i];
}
}
return null;
}
这是因为您在null
上有效地调用了getStringValue()
我建议将if
更改为:
if(xvars[i] != null && xvars[i].name.equals(varName)) {
...
}
Java具有强大的调试功能。使用它。但是在运行时没有错误。我所知道的就是XObject类在试图找到一个名为“x”的匹配XVar时,有一个NPE。然后你有一个NullPointerException
。在这个错误的stacktrace中,它会给你出现错误的类名和行号,所以用你的眼睛或调试器来观察它并解决问题。但是它被故意捕获,以防用户试图打印以百分号开头的内容。我知道问题出在哪里我只是不知道为什么会发生如果你知道NPE发生的确切路线,这将是对你和我们都有用的信息。
set: x=Hello StackOverflow
print: This was programmed in XScript!
print:
print: %x
public XVar getVar(String varName) {
for (int i = 0; i < varCount; i++) {
if (xvars[i].name == varName) {
return xvars[i];
}
}
return null;
}
System.out.println(xobject.getVar(xv.getStringValue().substring(1)).getStringValue());
if(xvars[i] != null && xvars[i].name.equals(varName)) {
...
}