سؤال

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

  1. لا تحدد معظم أكواد التحليل الحالية قواعد نحوية رسمية.عادةً ما أقوم باختراق شيء ما باللغة التي أختارها لأن ذلك سهل، وأنا أعرف كيفية القيام بذلك ويمكنني كتابة هذا الرمز بسرعة كبيرة.ومن السهل أيضًا على الأشخاص الآخرين الذين أعمل معهم الحفاظ عليه.ما هي مزايا وعيوب تحديد القواعد وإنشاء محلل حقيقي (كما يمكن للمرء أن يفعل مع أنتلر أو YACC) لتحليل الأشياء مقارنة بالاختراقات التي يستخدمها معظم المبرمجين لكتابة المحللين؟
  2. ما هي أفضل أدوات إنشاء المحلل اللغوي لكتابة المحلل اللغوي المستند إلى القواعد في C++ وPerl وRuby؟لقد نظرت أنتلر ولم أجد الكثير حول استخدام ANTLRv3 مع هدف C++، ولكن بخلاف ذلك يبدو الأمر مثيرًا للاهتمام.ما هي الأدوات الأخرى المشابهة لـ ANTLR والتي يجب أن أقرأ عنها؟
  3. ما هي الكتب والمقالات الأساسية التي يرغب الشخص في معرفة المزيد عن التحليل؟لسوء الحظ، لم تكن الدورة التدريبية في المترجمين جزءًا من تعليمي، لذا فإن المواد الأساسية موضع ترحيب كبير.لقد سمعت أشياء عظيمة عن كتاب التنين, ، ولكن ماذا يوجد هناك؟
هل كانت مفيدة؟

المحلول

في 1.، أود أن أقول أن الميزة الرئيسية هي قابلية الصيانة -- إجراء تغيير بسيط على اللغة يعني فقط إجراء تغيير بسيط في القواعد، بدلاً من اختراق النقاط المختلفة في الكود والتي قد يكون لها علاقة بما تريد تغييره...أوامر من حيث الحجم إنتاجية أفضل ومخاطر أقل للأخطاء.

على 2.و3.، لا يمكنني اقتراح ما يتجاوز ما وجدته بالفعل (أنا في الغالب أستخدم Python و pyparsing, ، ويمكن التعليق من خلال خبرتي في العديد من أطر التحليل التي تركز على بايثون، ولكن بالنسبة لـ C++، أستخدم في الغالب القديم الجيد yacc أو bison على أية حال، ونسختي القديمة المتعرجة من كتاب التنين - وليست الطبعة الأخيرة، في الواقع - هي كل ما أحتفظ به بجانبي لهذا الغرض...).

نصائح أخرى

إليك رأيي في أسئلتك (الجيدة جدًا):

  1. أعتقد أن المحلل اللغوي يستفيد أكثر من المواقف غير التافهة التي توجد فيها القواعد النحوية بالفعل.عليك أن تعرف كيفية عمل المحللين والقواعد النحوية للتفكير في هذه التقنية، وليس كل مطور يفعل ذلك.
  2. lex/yacc عبارة عن أدوات Unix قديمة قد تكون قابلة للاستخدام كمطور C++.ربما بيسون كذلك.
  3. ANTRL والكتاب المصاحب له جيدان جدًا. "كتابة المجمعين والمترجمين الفوريين" يحتوي على أمثلة C++ التي قد تعجبك.

يعد نمط GoF Interpreter أسلوبًا آخر لكتابة "اللغات الصغيرة".نلقي نظرة على ذلك.

دعونا نبني مترجمًا هو برنامج تعليمي خطوة بخطوة حول كيفية كتابة مترجم بسيط.الكود مكتوب بلغة دلفي (باسكال)، ولكنه بسيط بما يكفي لترجمته بسهولة إلى معظم اللغات الأخرى.

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

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

إذا كنت تريد معرفة كيفية عمل هذه الأمور داخليًا وكيفية كتابتها بنفسك، فإنني أوصي بالبدء بالفصل الثامن ("المحلل الوظيفي") من كتاب جراهام هاتون. البرمجة في هاسكل.بمجرد أن تفهم هذا الفصل جيدًا (والذي قد يستغرق عدة قراءات)، ستكون جاهزًا.

في لغة Perl، تعد وحدات Parse::RecDescent هي أول مكان للبدء.أضف برنامجًا تعليميًا إلى اسم الوحدة وسيتمكن Google من العثور على الكثير من البرامج التعليمية لمساعدتك على البدء.

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

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

بالنسبة لـ C++، أود أيضًا أن أقترح lex/yacc.بالنسبة لروبي، يبدو هذا خيارًا لائقًا: كوكو/آر (أوبي)

توقيت مضحك:قضيت الكثير من هذا الصباح أتساءل عن أجهزة الدولة والموزعين، وأحاول معرفة كيف يمكنني معرفة المزيد عنها.

لمدة 2، يمكنك إلقاء نظرة على راجيل (إنه جيد لـ C++ وRuby).

إليك برنامج تعليمي قائم بذاته (10 صفحات!) ، مترجم مترجم محمول بالكامل والتي يمكن استخدامها لتصميم وتنفيذ DSLs "منخفضة النفقات العامة" بسرعة كبيرة:

http://www.bayfronttechnologies.com/mc_tutorial.html

يرشدك هذا الموقع عبر ورقة بحثية كتبها Val Schorre عام 1964 حول MetaII.نعم، 1964.وهذا مذهل.هذه هي الطريقة التي تعلمت بها عن المجمعين مرة أخرى في عام 1970.

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