문제

저는 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 지원에 관심이 없다는 것을 알고 있지만, 필요에 따라 다른 사람들이 문제를 해결할 수 있도록 이 스레드에서 이 내용을 공유해야 한다고 생각했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top