سؤال

أواجه بعض المتاعب مع BNF. لا يمكنني معرفة ما يبدو أنه الطريقة المعتادة لفعل الأشياء (إذا كان هناك واحدة) ، وما إذا كانت هناك أنواع مثل char أو int أو أي شيء مدمج بالفعل.

ومع ذلك ، فإن مشكلتي الرئيسية هي عدم فهم كيف يعمل جزء BNF في الأقواس المجعد.
أعطى شيئًا مثل:

exp    : term                           {$$ = $1;}  
| exp '+' term                   {$$ = $1 + $3;}  
| exp '-' term                   {$$ = $1 - $3;}  
;  

(سُرق هذا بسهولة من مكان ما ، وهو لـ YACC / C)

ما هي الأشياء في الأقواس المجعد التي تقولها بالفعل؟ لقد نظرت إلى شيء مشابه بالنسبة لمولد محلل السعيد أيضًا ، وكنت مرتبكًا بالمثل.

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

المحلول

تحتاج إلى التمييز بين BNF بشكل عام (و EBNF) وبناء جملة YACC. ما تعنيه الأقواس في BNF يختلف مع اللهجة. غالبًا ما يعني "اختيار أحد البدائل" ، أو يمكن ربطه بالتكرار ، أو كليهما. في EBNF (ISO 14977: 1996) ، "{...} 'يعني تكرار الصفر أو أكثر ، و" {...}-' يعني تكرار مرة أو أكثر (ولماذا هذا هو '-وليس أ "+" غامض). يستخدم IETF RFC-5234 ولهجة BNF لا تستخدم '{}' على الإطلاق.

في قواعد YACC ، على الرغم من ذلك ، فإن الأقواس تحيط الإجراءات التي يتعين تنفيذها عند مطابقة القاعدة (تقل في المصطلحات). لذلك '{$$ = $1;}"الإجراء يعني" تعيين القيمة التي تتطابق مع "المصطلح" إلى نتيجة تقليل "exp :: = term" (باستخدام متغير آخر من BNF).

نصائح أخرى

الأشياء الموجودة داخل الأقواس المجعد هي في الواقع رمز C الذي يتم تنفيذه عند تحليل القاعدة المقابلة. ال $ الرموز هي أصحاب نائبة يتم استبدالها بالقيم الفعلية التي يتم تحليلها بواسطة YACC: $$ هي النتيجة التي ترغب في حسابها ، بينما $1 إلى $n تمثل قيم الرموز على الجانب الأيمن من القاعدة.

على سبيل المثال ، القاعدة exp '+' term { $$ = $1 + $3; }, $1 بالعودة الى exp و $3 هل term, ، لذلك يقول أنه عندما يتم تحليل هذه القاعدة ، أضف exp و term للحصول على النتيجة.

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