我的要求是解析javascript文件并获得json格式的AST(抽象语法树)。esprima.parseScript()函数接受js代码并正确地生成AST。但是,如何使用esprima从不同的js文件中读取js代码并对其进行解析?我需要能够从Java类调用js函数。
我尝试用Java读取我想要解析的js,并将其作为输入传递给函数。但是,下面的代码给出了一个异常。
parser.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)发布于 2021-02-25 20:04:37
我在我的代码中发现了这个问题。问题出在我阅读javascript的方式上。当我将代码改为使用readLine()而不是读取每个字符时,它开始正常工作。
https://stackoverflow.com/questions/66350997
复制相似问题