سؤال

ما هي أفضل طريقة لإنشاء محلل في C ++ من ملف مع Grammar؟

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

المحلول

قد ترغب أيضا في إلقاء نظرة على هذه الروابط:

نصائح أخرى

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

إذا كنت ستستخدم مولد محلل محلل، فهناك خياران جيدان: byacc و Antlr. إذا كنت تريد شيئا ما (معقول) متوافق مع YACC، BYACC هو خيارك الأفضل. إذا كنت تبدأ من البداية، فلن يكون هناك أي رمز موجود ولا تجربة تفضل باستخدام شيء متوافق مع YACC، فإن Antlr هو بالتأكيد أفضل رهان لك.

منذ أن تم ذكرها، سأتحدث أيضا عن البيسون. كنت أتجنب بيسون مثل الطاعون أنه هو. نصيحة بروكس إلى "خطة لرمي واحد بعيدا" تنطبق هنا. كتب روبرت كوربيت (مؤلف Biace of Byacc) بيسون كحل له أول مولد محلل. لسوء الحظ، أعطاها إلى جنو بدلا من إلقاءها بعيدا. في حالة كلاسيكية من التسويق الضرب بالتميز الفني، يستخدم Bison على نطاق واسع (وحتى الموصى به، من قبل أولئك الذين لا يعرفون أفضل) بينما يظل BYACC غامضا نسبيا.

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

  1. يمكن تجميع الأوقات مع أنه يمكن أن يتفوق - 10 دقائق شائعة، ويمكن أن يستغرق قواعد قواعد أكبر / أكثر تعقيدا لفترة أطول (على افتراض أنه لا يحطم المحول البرمجي).
  2. إذا قمت بإجراء أي خطأ على الإطلاق، فيمكنك أن تنتج رسائل خطأ طويلة بجنون من المستحيل فعليا فك التشفير. إن رسائل الخطأ من الكود الثقيل للقوالب سيئة للغاية على أي حال، وتشدد الروح النظام أكثر من أي شيء آخر تقريبا.

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

هناك ثني و الثور. وبعد أبناء عمومة LEX و YACC تأخذ وجود C ++ في الاعتبار.

هل نظرت في LEX و YACC. ب إلى اقتباس من القسم 5 من المستند المرتبط:

طريقتي المفضلة لجعل محلل C ++ هي أن يكون لديك Lex إنشاء ملف C عادي، والسماح YACC بإنشاء رمز C ++. عندما تقوم بعد ذلك بربط التطبيق الخاص بك، قد يتم تشغيل بعض المشكلات لأن التعليمات البرمجية C ++ بشكل افتراضي لن تتمكن من العثور على وظائف C، إلا إذا أخبرتها أن هذه الوظائف خارجية "C".

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

استغرقت الآلة الحاسبة 1 + 2 * 3 على سبيل المثال وبصمت شجرة بناء الجملة. ولم يصف الوثائق كيفية بناء الشجرة ومع ذلك، فقد استغرقني القليل من الوقت للعمل.

إذا كنت ذاهبا مرة أخرى، فسأنظر إلى "Antlr" لأنها تبدو جيدة ودعم جيدا.

مارتن.

أفضل طريقة لإنشاء المحلل المحلل هي استخدام LEX و YACC.

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