سؤال

أنا أعمل على محلل وأنا محبط حقًا.في اللغة يمكن أن يكون لدينا تعبير مثل:

new int[3][][]

أو

new int[3]

يتم تحليل معظمها بشكل صحيح، باستثناء المصفوفات الفارغة في النهاية.في المحلل الخاص بي لدي:

Expression : int
             char
             null
             (...many others...)
             new NewExpression

ومن ثم فإن NewExpression هو:

NewExpression : NonArrayType '[' Expression ']' EmptyArrays
              | NonArrayType '[' Expression ']' 

ثم يكون EmptyArrays واحدًا أو أكثر من الأقواس الفارغة - إذا اشتق EmptyArrays السلسلة الفارغة، فإنه يضيف 20 تعارضًا للتحول/الحد:

EmptyArrays : EmptyArrays EmptyArray
            | EmptyArray
EmptyArray  : '[' ']'

ومع ذلك، عندما أنظر في .info ملف للمحلل، أحصل على هذا:

State 214¬
¬
▸   NewExpression -> NonArrayType lbrace Expression rbrace . EmptyArrays    (rule 80)¬
▸   NewExpression -> NonArrayType lbrace Expression rbrace .    (rule 81)¬
¬
▸   dot            reduce using rule 81¬
▸   ';'            reduce using rule 81¬
▸   ','            reduce using rule 81¬
▸   '+'            reduce using rule 81¬
▸   '-'            reduce using rule 81¬
▸   '*'            reduce using rule 81¬
▸   '/'            reduce using rule 81¬
▸   '<'            reduce using rule 81¬
▸   '>'            reduce using rule 81¬
▸   '<='           reduce using rule 81¬
▸   '>='           reduce using rule 81¬
▸   '=='           reduce using rule 81¬
▸   '!='           reduce using rule 81¬
▸   ')'            reduce using rule 81¬
▸   '['            reduce using rule 81    --I expect this should shift
▸   ']'            reduce using rule 81¬
▸   '?'            reduce using rule 81¬
▸   ':'            reduce using rule 81¬
▸   '&&'           reduce using rule 81¬
▸   '||'           reduce using rule 81

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

لست متأكدًا تمامًا مما يحدث لأنه عندما أقوم بتجريد كل الأمتعة الزائدة من الأمتعة (على سبيل المثال) عن طريق بدء التحليل بـ NewExpression, ، يتم تحليل الأقواس الإضافية بشكل صحيح.ليس من الممكن أن يبدأ التعبير أو البيان أو أي غير طرفي في القواعد بقوس أيسر.خاصةً لأن لدي قاعدة مماثلة لعبارات if/else، والتي تولد تعارضًا في التحول/تقليل، ولكنها تختار التحول إذا كان الرمز المميز التالي آخر (هذه المشكلة موثقة جيدًا).

هل يمكنك مساعدتي في معرفة ما هو الخطأ؟أنا حقًا أقدر مساعدتك، فأنا أميل حقًا إلى طواحين الهواء محاولًا اكتشاف المشكلة.

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

المحلول

من المحتمل أن يكون لديك أولوية محددة لـ "[" و/أو "]" بشيء مثل %left '[' الذي يسبب هذا السلوك.قم بإزالة إعلان الأسبقية هذا، وسيكشف هذا عن تعارض التحول/الحد الموجود هنا.أما بالنسبة لسبب التحول/الحد من الصراع، فمن المحتمل أن يكون لديك أيضًا قاعدة:

Expression: Expression '[' Expression ']'

للوصول إلى مجموعة.المشكلة هي أنه منذ أ NewExpression هو Expression قد يتبعه فهرس مثل هذا، وعند النظر إلى المظهر الأمامي لـ '['، لا يمكن معرفة ما إذا كانت هذه بداية تعبير فهرس أم بداية EmptyArray - قد يتطلب ذلك نظرة أمامية ذات رمزين مميزين.

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

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