Rhino를 사용하여 PEG.js 0.7.0 파서를 빌드하는 방법(Java SE 6 ScriptEngine API)
-
13-12-2019 - |
문제
저는 Maven 플러그인을 사용하여 파서를 구축해 왔습니다(예:PEG.js 버전 0.6.1을 사용하여 Java 코드에서 PEG.js 호출)에 성공했지만 이제 새 버전으로 업그레이드하려고 하면 다음 오류 메시지와 함께 실패합니다.
sun.org.mozilla.javascript.internal.EcmaError: SyntaxError: missing ; before statement (#3213(eval)#1) in #3213(eval) at line number 1
디버깅하는 동안 PEG.buildParser() 함수 호출에서 나오는 파서가 구문적으로 잘못된 것처럼 보이지만 브라우저에서 호출하는 동안에는 그런 일이 발생하지 않는다는 것을 발견했습니다.
내가 부르는 방법은 다음과 같습니다.
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine jsEngine = manager.getEngineByName("JavaScript");
jsEngine.eval(new InputStreamReader(this.getClass().getResourceAsStream(PEGJS_LIB)));
Invocable invok = (Invocable) jsEngine;
Object peg = jsEngine.get("PEG");
invok.invokeMethod(peg, "buildParser", grammarSource);
어디, grammarSource
, 내 테스트 사례에서 다음과 같이 사용되는 기본 문법입니다. 웹사이트의 예, 그리고 PEGJS_LIB = peg-0.7.0.js
.
어떤 아이디어라도 환영합니다!여기서는 다 떨어졌어요...
해결책
이 문제의 원인을 추적했습니다.'PEG.compiler.emitter.Codie.pushRaw.unindent()' 라인 3681은 템플릿을 파괴합니다.이 기능이 파서에 얼마나 중요한지 완전히 결정하지는 않았지만 '있으면 좋은' 것 같습니다.함수의 본문을 로컬에서 교체했고 Rhino는 예상대로 작동했습니다.
function unindent(code, level, unindentFirst) {
return code
}
저는 David가 Rhino 지원에 관심이 없다는 것을 알고 있지만, 필요에 따라 다른 사람들이 문제를 해결할 수 있도록 이 스레드에서 이 내용을 공유해야 한다고 생각했습니다.