首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用esprima从Java中解析javascript文件?

如何使用esprima从Java中解析javascript文件?
EN

Stack Overflow用户
提问于 2021-02-24 20:31:33
回答 1查看 226关注 0票数 0

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

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

parser.js:

代码语言:javascript
复制
    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代码:

代码语言:javascript
复制
        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);

但是,我得到了以下异常:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-02-25 20:04:37

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66350997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档