مساعدة مع التحول/تقليل الصراع يحاول النموذج (X)* (س ب)*

StackOverflow https://stackoverflow.com/questions/949976

سؤال

أحاول نموذج EBNF التعبير

("declare" "namespace" ";")* ("declare" "variable" ";")*

لقد تراكمت yacc (Im باستخدام MPPG) النحوي ، والتي يبدو أن تمثل هذا ، لكنه فشل في مباراة اختباري التعبير.

حالة اختبار أحاول المباراة

declare variable;

رمز تيار من lexer هو

KW_Declare
KW_Variable
Separator

قواعد تحليل يقول ان هناك "تحولا/تقليل الصراع الدولة 6 على KW_Declare".لقد حاولت حل هذه مع "%اليسار PrologHeaderList PrologBodyList" ، ولكن لا يعمل حل.

Program                     : Prolog;
Prolog                      : PrologHeaderList PrologBodyList;

PrologHeaderList            : /*EMPTY*/
                            | PrologHeaderList PrologHeader;
PrologHeader                : KW_Declare KW_Namespace Separator;

PrologBodyList              : /*EMPTY*/
                            | PrologBodyList PrologBody;
PrologBody                  : KW_Declare KW_Variable Separator;

KW_Declare KW_Namespace KW_Variable فاصل كل الرموز مع القيم "تعلن", "naemsapce", "متغير", ";".

هل كانت مفيدة؟

المحلول

لقد مر وقت طويل منذ ان كنت تستخدم أي شيء yacc مثل, ولكن هنا بعض الاقتراحات التي قد أو قد لا تساعد.

يبدو أنك تحتاج إلى 2-رمزية lookahead في هذه الحالة.محلل يصل إلى آخر PrologHeader, و يجب أن تقرر ما إذا كان المقبل هو بناء PrologHeader أو PrologBody, و لا أستطيع أن أقول أن من KW_Declare.إذا كان هناك توجيها إلى زيادة lookahead في هذه الحالة, فإنه من المحتمل حل المشكلة.

يمكنك أيضا إدخال السياق إلى الإجراءات الخاصة بك:بدلا من تحديد PrologHeaderList و PrologBodyList, تعريف PrologRuleList وقد الإجراءات رمي خطأ إذا كان رأس يظهر بعد الجسم.قبيحة, ولكن في بعض الأحيان عليك أن تفعل ذلك:ما يظهر بسيطة في قواعد اللغة قد لا تكون بسيطة في إنشاء محلل.

أ hackish النهج قد يكون الجمع بين الرموز:بدلا من KW_Declare و KW_Variable, ، lexer التعرف على الفضاء واستخدام KW_Declare_Variable.لأن كلا هي كلمات لن تصل الى مساحة الاصطدام المشاكل.

نصائح أخرى

يعد Grammar في الجزء العلوي منتظما، لذا يمكنك إخراجه كإدارة DFA (أو NDA وتحويله إلى DFA) ثم قم بتحويل DFA إلى قواعد اللغة. إنها الفول بينما سأترك العمل كممارسة للقارئ.

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