سؤال

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

لقد رأيت تعليقات إيجابية حول Antlr في العديد من المنتديات في الماضي، ولدي فضول لمعرفة ما قد يفوتني.لذا، إذا كنت قد استخدمت كليهما، فيرجى إخباري ما هو الأفضل أو الأكثر تقدمًا في Antlr.القيود الحالية التي أواجهها هي أنني أعمل في متجر C++، وأي منتج نشحنه لن يتضمن Java، لذلك يجب على المحللين الناتجين اتباع هذه القاعدة.

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

المحلول

تحديث / تحذير: قد يكون هذا الجواب من تاريخ

!

واحد الفرق الرئيسي هو أن ANTLR يولد محلل LL (*)، في حين YACC والبيسون كلا توليد موزعي التي LALR. هذا تمييز مهم لعدد من التطبيقات، ومشغلي الكائن الأكثر وضوحا:

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

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

expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

لاحظ أن تترك-العودية كل من expr وactuals القواعد. هذا ينتج AST أكثر فاعلية عندما يحين الوقت لتوليد رمز لأنه يتجنب الحاجة إلى سجلات متعددة وإراقة غير ضرورية (شجرة اليسارية يمكن انهار في حين أن شجرة اليمينية لا يمكن).

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

نصائح أخرى

والفرق الأهم بين YACC / بيسون وANTLR هو نوع من قواعد النحو يمكن لهذه الأدوات معالجة. YACC / بيسون قواعد النحو مقبض LALR، ANTLR يعالج قواعد النحو LL.

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

وبقدر ما يذهب المزايا، هناك جوانب حيث توجد قواعد النحو LALR المزايا على قواعد النحو LL وهناك جوانب أخرى حيث توجد قواعد النحو LL المزايا على قواعد النحو LALR.

وYACC / بيسون توليد جدول يحركها موزعي، وهو ما يعني ويرد "منطق المعالجة" في بيانات البرنامج محلل، وليس ذلك بكثير في التعليمات البرمجية محلل ل. دفع قبالة هو أنه حتى محلل للغة معقدة للغاية لديه بصمة رمز صغير نسبيا. وكان هذا أكثر أهمية في 1960s و 1970s عندما كان الأجهزة محدودة للغاية. الجدول مدفوعة مولدات محلل تعود إلى هذا العصر ورمز صغير البصمة كان أحد المتطلبات الرئيسية آنذاك.

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

وANTLR موزعي ولدت وعادة ما تكون على مقربة من 10.000 خطوط رمز وأكثر من ذلك. بخط اليد الترميز التكراري النموذجي في كثير من الأحيان في نفس الملعب. مترجم أوبيرون ويرث هو ربما أكثر واحد التعاقد مع حوالي 4000 سطر من الكود بما في ذلك رمز جيل، ولكن أوبيرون هي لغة مدمجة للغاية مع قواعد الإنتاج فقط حوالي 40.

وكما أشار شخصا ما سبق، زائد كبيرة لANTLR هي أداة IDE الرسومية، ودعا ANTLRworks. وهي قواعد اللغة ولغة كاملة تصميم المختبر. ومن visualises القواعد النحوية الخاصة بك كما كنت اكتب لهم وإذا وجد أي الصراعات التي سوف تظهر لك بوضوح ما للصراع هو وما هي أسباب ذلك. حتى أنه يمكن تلقائيا ريفاكتور وحل النزاعات مثل اليسار العودية. وبمجرد الانتهاء من قواعد اللغة مجانا النزاع، يمكنك أن تدع ANTLRworks تحليل ملف إدخال اللغة وبناء شجرة تحليل وAST لديك وتظهر شجرة بيانيا في IDE. هذا هو ميزة كبيرة جدا لأنها يمكن أن توفر لك العديد من ساعات العمل: سوف تجد الأخطاء المفاهيمية في تصميم لغتك قبل بدء الترميز! لم أجد أي أداة من هذا القبيل لقواعد النحو LALR، على ما يبدو ليس هناك أي أداة من هذا القبيل.

وحتى للأشخاص الذين لا يرغبون في توليد موزعي ولكن كود يد العون لهم، ANTLRworks هو أداة عظيمة للغة التصميم / النماذج. من المحتمل جدا أفضل هذه الأدوات المتاحة. للأسف، لا مساعدتك إذا كنت ترغب في بناء موزعي LALR. التحول من LALR ليرة لمجرد الاستفادة من ANTLRworks قد يكون من المفيد، ولكن بالنسبة لبعض الناس، والتحول أنواع قواعد اللغة يمكن أن تكون تجربة مؤلمة جدا. وبعبارة أخرى: YMMV

بعض المزايا لـ ANTLR:

  • يمكن إخراج المحلل اللغوي بلغات مختلفة - Java غير مطلوب لتشغيل المحلل اللغوي الذي تم إنشاؤه.
  • واجهة المستخدم الرسومية الرائعة تجعل تصحيح الأخطاء النحوية أمرًا سهلاً (على سبيل المثال.يمكنك رؤية AST الذي تم إنشاؤه مباشرة في واجهة المستخدم الرسومية، دون الحاجة إلى أدوات إضافية)
  • الكود الذي تم إنشاؤه هو في الواقع قابل للقراءة من قبل الإنسان (إنه أحد أهداف ANTLR) وحقيقة أنه يولد موزعي LL يساعد بالتأكيد في هذا الصدد.
  • تعريف المحطات خالٍ من السياق أيضًا (على عكس التعبير العادي في (f)lex) - مما يسمح، على سبيل المثال، بتعريف محطات تحتوي على أقواس مغلقة بشكل صحيح

بلدي .02 دولار

وثمة ميزة أخرى من ANTRL هو أنه يمكنك استخدام ANTLRWORKS ، على الرغم من أنني لا أستطيع أقول إن هذا هو ميزة صارمة، كما قد تكون هناك أدوات مماثلة للمولدات الأخرى كذلك.

  • يؤدي Bison وFlex إلى بصمة ذاكرة أصغر، لكن ليس لديك IDE رسومي.
  • يستخدم antlr المزيد من الذاكرة، ولكن لديك antlrworks، وهو بيئة تطوير متكاملة رسومية.

عادةً ما يكون استخدام ذاكرة Bison/Flex ميغابايت أو نحو ذلك.قارن ذلك مع antlr - بافتراض أنه يستخدم 512 بايت من الذاكرة لكل رمز مميز في الملف الذي تريد تحليله.4 ملايين رمز ونفدت الذاكرة الافتراضية على نظام 32 بت.

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

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