需要帮助,开发基于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) {

我刚刚开始研究一种叫做XScript的编程语言。它的设计使我可以从Java应用程序运行它,也可以通过Java应用程序重新编程。我的想法是,我可以在游戏中创建虚拟计算机,或者创建一个随着时间的推移自行开发的程序。到目前为止,我有以下代码。我知道由于专有软件的原因,可能需要对名称进行修改,但目前还可以

主要类别:

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)) {
    ...
}