سؤال

لقد قمت ببناء المحللين باستخدام البرنامج المساعد Maven (على سبيل المثال.استدعاء PEG.js من كود Java) بنجاح باستخدام الإصدار 0.6.1 من 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 بإتلاف القوالب.لم أحدد بشكل كامل مدى أهمية هذه الوظيفة بالنسبة للمحلل اللغوي، ولكن يبدو أنها "من الجميل أن تمتلكها".لقد استبدلت جسم الوظيفة محليًا وعمل وحيد القرن كما هو متوقع.

function unindent(code, level, unindentFirst) {
  return code
}

أعلم أن ديفيد ليس مهتمًا بدعم Rhino، لكنني أعتقد أنه يجب علي مشاركة هذا في هذا الموضوع حتى يتمكن الآخرون من حل المشكلة حسب الحاجة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top