سؤال

لقد كتبت مترجمًا أساسيًا يولد AST ، مع الأخذ في الاعتبار الأسبقية في التعبيرات بشكل صحيح. ومع ذلك ، عند إجراء توليد الرمز لإنتاج رمز C ++ ، لست متأكدًا من كيفية التعامل مع استخدام الأقواس.

لهذا التعبير:

A - (B - c)

AST أدناه:

   -
  / \
 A   -
    / \
   B   C

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

هل هناك أي قواعد تملي هذا النوع من السلوك وكيفية معرفة متى تستخدم الأقواس. Plus و Minus لهما نفس المستوى من الأسبقية في معظم اللغات وأود أن أجعل هذا العمل لجميع المشغلين.

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

المحلول

تاريخيا ، يسمون هذه "الطباعة الجميلة". إذا كنت Google بالإضافة إلى "الأسبقية" ، فقد تجد بعض الأمثلة لمساعدتك.

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

نصائح أخرى

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

لا يكفي معرفة أسبقية العمليات. تحتاج أيضًا إلى معرفة الارتباط من العمليات. يسمح بتجميع عمليات متساوية الأسبقية بشكل صحيح. لنفترض أن الطرح يترك نقابيًا ، لذا A-B-C مساوي ل (A-B)-C, ، ولكن ليس ل A-(B-C).

ما عليك سوى كتابة جدول الأسبقية والربط بالكامل لجميع عملياتك واستشره أثناء توليد تعبيرك.

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