سؤال

لدي جملة مثل

%(var)

و

%var

و (فار)

القواعد هي شيء من هذا القبيل

optExpr:
    | '%''('CommaLoop')'
    | '%' CommaLoop

CommaLoop:
    val | CommaLoop',' val

Expr:
    MoreRules
    | '(' val ')'

المشكلة هي أنه لا يبدو أن تكون قادرة على معرفة إذا ) ينتمي إلى %(CommaLoop) أو % (val) لكنه يشكو على ) بدلا من (.ما هيك ؟ لا ينبغي عليه تقديم شكوى (?و كيف يجب إصلاح الخطأ ؟ أعتقد صنع %( مميز هو حل جيد ولكن أريد أن أكون متأكدا من السبب $( ليس خطأ قبل القيام بذلك.

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

المحلول

ويرجع ذلك إلى طريقة LR تحليل الأعمال.LR تحليل فعالية من أسفل إلى أعلى ، تجميع الرموز وفقا RHS من القواعد النحوية ، واستبدالها LHS.عندما محلل 'التحولات', فإنه يضع رمزية على المكدس ، ولكن في الواقع لا يطابق القاعدة حتى الآن.بل المسارات جزئيا مطابقة القواعد عبر الحالي.عندما يحصل على الدولة أن يتوافق مع نهاية حكم ، فإنه يمكن تقليل ، ظهرت رموز RHS خارج المكدس و دحر واحد رمز تدل على LHS.لذلك إذا كان هناك صراعات لا تظهر حتى محلل يحصل على نهاية بعض الحكم و لا تستطيع أن تقرر ما إذا كان خفض (أو تقليل).

في المثال الخاص بك ، بعد رؤية % ( فال, هذا هو ما سوف يكون على المكدس (أعلى على الجانب الأيمن هنا).عندما lookahead هو ), لا يمكن أن تقرر ما إذا كان ينبغي البوب فال والحد من عبر وحكم CommaLoop:فال, أو إذا كان يجب أن تحول ) لذلك يمكن أن ثم البوب 3 أشياء وتقليل مع القاعدة Expr:'(' فال ')'

أفترض هنا أن لديك بعض قواعد إضافية مثل CommaLoop:Expr, وإلا قواعد اللغة الخاصة بك في الواقع لا يطابق أي شيء والبيسون/yacc سوف يشكو غير المستخدمة غير المحطات.

نصائح أخرى

الآن، لا يبدو أن شرحك وقواعدك مطابقة. في شرحك، تظهر جميع العبارات الثلاث التي لها "فار"، لكن قواعد اللغة الخاصة بك يظهر تلك التي تبدأ ب "٪" على أنها تسمح بقائمة مفصولة بفواصل، في حين أن الشخص دون يسمح فقط ب "Val" فقط.

في الوقت الحالي، سأفترض أن الثلاثة يجب أن يسمحوا بقائمة مفصولة بفواصل. في هذه الحالة، كنت عامل القواعد أكثر مثل هذا:

optExpr: '%' aList

aList: CommaLoop
    | parenList

parenList: '(' CommaLoop ')'

CommaLoop: 
    | val 
    | CommaLoop ',' val

Expr: MoreRules
    | parenList

لقد قمت بتغيير OptexPR و EXPR، لذلك لا يمكن لأي منهما تتطابق مع تسلسل فارغ - تخميني ربما لا تنوي أن تبدأ به. لقد جسد هذا بما يكفي لتشغيله من خلال ByACC؛ لا ينتج أي تحذيرات أو أخطاء.

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