ما الذي يدور بين {و} عند كتابة BNF؟
-
27-09-2019 - |
سؤال
أواجه بعض المتاعب مع 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
للحصول على النتيجة.