سؤال

وعن طريق فليكس وبيسون، لدي مواصفات النحوي للغة الاستعلام المنطقية التي تدعم المنطقي "و"، "أو"، و "لا" العمليات، وكذلك subexpressions متداخلة باستخدام "()".

وكان جميع جيدا حتى أنني لاحظت أن الأسئلة مثل "A و B أو C و D" التي أرغب في تحليل بأنها "(A & B) | (C & D)" كان في الواقع يجري تفسيرها على أنها "A & ( B | (C & D)) ". أنا متأكد تقريبا هذه قضية ترابطيات، ولكن لا يمكن أن يبدو لإيجاد تفسير مناسب أو أي مكان المثال - أن أو أنا في عداد المفقودين شيء مهم

.

والمعلومات ذات الصلة من boolpars.y:

%token TOKEN
%token OPEN_PAREN CLOSE_PAREN
%right NOT
%left AND
%left OR

%%

query:      expression                          { ... }
            ;

expression: expression AND expression           { ... }
            | expression OR expression          { ... }
            | NOT expression                    { ... }
            | OPEN_PAREN expression CLOSE_PAREN { ... }
            | TOKEN                             { ... }
            ;

ويمكن لأي شخص أن يجد الخلل؟ لا استطيع ان ارى لماذا بيسون هو عدم اعطاء "أو" الأسبقية المناسبة.

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

المحلول

ومن مستندات البيسون:

<اقتباس فقرة>   

ويتم تحديد الأسبقية المشغل من قبل   ترتيب خط الإعلانات.   ارتفاع عدد خط   إعلان (أقل على الصفحة أو   الشاشة)، وارتفاع الأسبقية.

وحتى في حالة العرض أو أقل على الشاشة ولها أعلى الأسبقية. تغيير ترتيب ل

%left OR
%left AND

و(I لم نجرب ذلك على الرغم من)

نصائح أخرى

لماذا لا تقسيم الإنتاج، كما هو الحال في هذا المقتطف من لغة C العش

logical_AND_expression:
    inclusive_OR_expression
    | logical_AND_expression ANDAND inclusive_OR_expression
            {$$ = N2(__logand__, $1, $3);}
    ;

logical_OR_expression:
    logical_AND_expression
    | logical_OR_expression OROR logical_AND_expression
            {$$ = N2(__logor__, $1, $3);}
    ;

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

%left OR
%left AND

وثم التعبير A & B | سيتم تخفيض C & D إلى ((A & B) | (C & D))

إذا كنت تحديد الأسبقية على النحو التالي:

%left AND
%left OR

وثم التعبير A & B | سيتم تخفيض C & D إلى ((A & (B | C)) & D)

والتعبير التفريق واحدة ستكون كما يلي:

true & true | true & false

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

ومزدوجة تحقق اختبارات للتأكد. لاحظ أيضا أن هذا هو أمر من اليسار٪،٪ الحق، الخ التعاريف الواردة في الجزء رأس التي تحدد الأسبقية، وليس الترتيب الذي يحدد القواعد نفسها. إذا كان لا يزال لا يعمل، وربما انها بعض المناطق الأخرى في التعليمات البرمجية التي العبث عنه، أو ربما إصدار البيسون مختلفة (أنا فقط اطلاق النار في الظلام في هذه النقطة).

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