0

我的要求是解析一个 javascript 文件并以 json 格式获取 AST(抽象语法树)。esprima.parseScript() 函数接受 js 代码并正确生成 AST。但是,如何使用 esprima 从不同的 js 文件中读取 js 代码并进行解析呢?我需要能够从 Java 类调用 js 函数。

我尝试在 Java 中读取我想要解析的 js,并将其作为输入传递给函数。但是,下面的代码给出了一个例外。

解析器.js:

    load('esprima.js');
    function parsejs(jscode){
       var op = esprima.parseScript(jscode);
       return JSON.stringify(op);
     }`

需要解析的js,example.js: function temp(){ return 5;}

用于读取 example.js 并将其作为参数传递给 parsejs 函数的 Java 代码:

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
        BufferedReader reader = new BufferedReader(newFileReader("example.js"));
        StringBuilder stringBuilder = new StringBuilder();
        char[] buffer = new char[10];
        while (reader.read(buffer) != -1) {
            stringBuilder.append(new String(buffer));
            buffer = new char[10];
        }
        reader.close();

        String content = stringBuilder.toString();
        engine.eval(new FileReader("parser.js"));
        Invocable invocable = (Invocable) engine;
        Object result = invocable.invokeFunction("parsejs",content);

        System.out.println(result);

但是,我收到以下异常:

javax.script.ScriptException: Error: Line 1: Unexpected token ILLEGAL in file:/C:/esprima.js at line number 5035 at column number 9
    at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:392)
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeFunction(NashornScriptEngine.java:190)
    at jsconvert.JSConvert.main(JSConvert.java:49)
Caused by: file:/C:/esprima.js:5035:9 Error: Line 1: Unexpected token ILLEGAL
    at jdk.nashorn.internal.runtime.ECMAException.create(ECMAException.java:113)
    at jdk.nashorn.internal.scripts.Script$Recompilation$174$226935AADA$esprima.L:12#L:4990#ErrorHandler#throwError(file:/C:/esprima.js:5035)
    at jdk.nashorn.internal.scripts.Script$Recompilation$173$233070A$esprima.L:12#L:5122#Scanner#throwUnexpectedToken(file:/C:/esprima.js:5164)
    at jdk.nashorn.internal.scripts.Script$Recompilation$142$250130$esprima.L:12#L:5122#Scanner#scanPunctuator(file:/C:/esprima.js:5667)
    at jdk.nashorn.internal.scripts.Script$Recompilation$127$274970$esprima.L:12#L:5122#Scanner#lex(file:/C:/esprima.js:6264)
    at jdk.nashorn.internal.scripts.Script$Recompilation$121$92260$esprima.L:12#L:1822#Parser#nextToken(file:/C:/esprima.js:2079)
    at jdk.nashorn.internal.scripts.Script$Recompilation$148$95915A$esprima.L:12#L:1822#Parser#expect(file:/C:/esprima.js:2166)
    at jdk.nashorn.internal.scripts.Script$Recompilation$150$189401$esprima.L:12#L:1822#Parser#parseFunctionSourceElements(file:/C:/esprima.js:4197)
    at jdk.nashorn.internal.scripts.Script$Recompilation$137$194562A$esprima.L:12#L:1822#Parser#parseFunctionDeclaration(file:/C:/esprima.js:4347)
    at jdk.nashorn.internal.scripts.Script$Recompilation$136$152687$esprima.L:12#L:1822#Parser#parseStatementListItem(file:/C:/esprima.js:3379)
    at jdk.nashorn.internal.scripts.Script$Recompilation$133$213757$esprima.L:12#L:1822#Parser#parseScript(file:/C:/esprima.js:4723)
    at jdk.nashorn.internal.scripts.Script$Recompilation$117$3582AAA$esprima.L:12#L:58#parse(file:/C:/esprima.js:122)
    at jdk.nashorn.internal.scripts.Script$Recompilation$116$5584AAA$esprima.L:12#L:58#parseScript(file:/C:/esprima.js:145)
    at jdk.nashorn.internal.scripts.Script$Recompilation$115$71A$\^eval\_.parsejs(<eval>:7)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:639)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
    at jdk.nashorn.api.scripting.ScriptObjectMirror.callMember(ScriptObjectMirror.java:199)
    at jdk.nashorn.api.scripting.NashornScriptEngine.invokeImpl(NashornScriptEngine.java:386)
4

1 回答 1

0

我在我的代码中发现了这个问题。问题在于我阅读 javascript 的方式。当我将代码更改为使用 readLine() 而不是读取每个字符时,它开始正常工作。

于 2021-02-25T12:04:37.210 回答