سؤال

ولقد تم الحفاظ على التحول / تقليل الأخطاء بعيدا. الآن أخيرا أعتقد أنني التقيت مباراتي.

Int[] a
a[0] = 1

ووكثافة العمليات [] يتم تعريف المشكلة كما

Type OptSquareBrackets

وبينما [0] هو الذي يعرف بأنه

Var | Var '[' expr ']'
نوع تعرف

وفار وعلى حد سواء كما VAR وهو أي [a-zA-Z][a-zA-Z0-9_] متغير صالحة. وبصرف النظر عن إضافة رمز وهمية (مثل **Decl** Type OptSquareBrackets بدلا من ذلك) هل هناك طريقة لكتابة هذه ليست لديها الصراع؟ من هذا قاعدة واحدة أحصل 1 التحول / تقليل والحد من 1 / الحد من التحذير.

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

المحلول

هل يمكنك تحديد رمز جديد

VarLBracket [a-zA-Z][a-zA-Z0-9_]*\[

وبالتالي تحديد إعلان

Type | VarLBracket ']';

ووتحديد الهدف مهمة ك

Var | VarLBracket expr ']';

نصائح أخرى

وإنشاء قاعدة ليكس مع [] منذ [] يستخدم فقط في إعلان وفي كل مكان آخر ستستخدم [فار]

ومن الناحية الفنية، وتنبع هذه المشكلة من محاولة ربط قواعد اللغة إلى معنى الدلالي الذي لا يختلف في الواقع في بناء الجملة.

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

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

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