هل سبق لك أن تستخدم على نحو فعال lexer/محلل في العالم الحقيقي ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/645468

سؤال

مؤخرا, لقد بدأت تعلم ANTLR.وأنا أعلم أن lexers/موزعي معا يمكن أن تستخدم لبناء لغات البرمجة.

بخلاف DSLs أو لغات البرمجة ، هل من أي وقت مضى بشكل مباشر أو غير مباشر المستخدمة lexer/محلل أدوات (والمعرفة) لحل مشاكل العالم الحقيقية?هل من الممكن متوسط مبرمج لحل تلك المشاكل دون معرفة lexers أو موزعي?

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

المحلول

نعم، لقد استخدمتهم.نعم، يمكنك القيام بالأشياء بدونها - ولكن في أي وقت تختار فيه الأداة الخاطئة للمهمة، فسوف تسبب ألمًا لا داعي له لنفسك.

بعض الأمثلة على الاستخدامات غير القياسية التي استخدمتها شخصيًا في استخدام التكنولوجيا من أجل:

  • استخراج البيانات من التقارير التي تم إنشاؤها بواسطة الأنظمة القديمة
  • انتقاء الأنماط في البيانات معقدة للغاية بالنسبة للتعبير العادي
  • تحليل البروتوكول
  • ألعاب مغامرات تعتمد على النصوص
  • واجهة برمجة التطبيقات metaprograming التي أكلت توليدو (ليس اسمها الحقيقي)
  • تحليل الكود/تحليل السجل
  • انتقاء الحقول "ذات الشكل الحر" في قاعدة البيانات
  • وأكثر من ذلك أنا أنسى (أنا عجوز)

نصائح أخرى

تسليط الضوء على تركيب.ال سايت يتيح لك محرر النصوص كتابة المعجم الخاص بك (في C++) لتوفير تمييز بناء الجملة لأي لغة مخصصة.لقد كتبت معجمي المخصص لـ Scite لتجديد المعلومات حول هذا الموضوع (درسته منذ فترة في جامعتي).

غالبًا ما تُستخدم التعبيرات العادية كبديل لمطابقة الأنماط والمعالجة اللغوية البسيطة.أصبح هذا أكثر شيوعًا في السنوات الأخيرة بفضل دعم RegEx المحسّن في أطر عمل مثل .NET.في كثير من الحالات، قد لا يعرف المطورون حتى تقنيات الليكسينغ/التحليل، وبالتالي يقعون في استخدام Regex افتراضيًا.

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

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

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

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

أما بالنسبة لعملية lex/yacc الكاملة؟أتوقع أن يتم استخدامه في الغالب لـ حقوق الملكية الفكرية وللأشياء التي تندرج تحت التعريف الفضفاض لـ DSL

أي وقت يوجد مستند ثابت (مثل ملف) ، أو وثيقة دينامية (مثل تيار تحدث مع مرور الوقت) ، وأن الوثيقة أي نوع من هيكل, سوف تجد نفسك تحتاج إلى نوع من محلل.بسيطة بما فيه الكفاية الهياكل يمكن أن تحصل من قبل مع المخصص تحليل (سلسلة القرصنة ، regexes ، إلخ.).عن الهياكل التي لا العش ، يمكنك أن تحصل من قبل مع آلة الدولة المحدودة;هنا lexer مولد هو في كثير من الأحيان مفيدة.عن الهياكل المعقدة ، إلى حد كبير نظم محلل.يمكنك كتابة موزعي باليد إذا كنت معتادا على العودية النسب أسلوب تحليل.حقا الهياكل المعقدة ، محلل مولد هو دائما تقريبا فوز كبير.

إذا كنت تريد أن عملية كمبيوتر الناطقة ، تحتاج lexers و موزعي أنها مكان الانطلاق.أنها ليست كافية ؛ عليك أن تفعل شيئا مع محلل النتيجة.

A مذهلة حقا استخدام lexing و التحليل الذي قمنا به هو ترجمة بشوش ، 1960 لغة ، C ، B-2 الشبح الانتحاري.انظر http://www.semdesigns.com/Products/Services/NorthropGrummanB2.html

يوجد مثال رائع على المعجم/المحلل اللغوي المستخدم في العديد من الأنظمة في Apache Lucene (مكتبة فهرس البحث مفتوحة المصدر).يستخدم كل من محلل الاستعلام ورمز المستند هذه التقنيات.بينما أعتقد أنه يمكنك تصنيف محلل الاستعلام في Lucene كمحلل dsl، إلا أنه لا يزال يُستخدم للمساعدة في حل مشكلة حقيقية.

في هذا الصدد، أنا متأكد من أن Google تستخدم نوعًا من المعجم/المحلل اللغوي لبناء جملة الاستعلام الخاص بها وتحليل المستندات.

هذا مثير للاهتمام -

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

مثال جميل للمشاة، لكنني ماشي جدًا في تجربتي معهم.

لم أستخدم أحد الأشخاص الكبار لإجراء أي تحليل معجمي حتى الآن، لكنني قمت بكتابة معجمي الخاص يدويًا لمشروع عملت عليه.كان علينا تحليل البيانات التي عادت من كمبيوتر بيانات مشروع Near Space وتم كتابتها على بطاقة SD بشكل ثنائي.اضطررت إلى تفكيك البتات وتحويلها من النظام الثنائي إلى النظام العشري ثم كتابة المحتويات بالكامل في ملف مفصول بفواصل.

من الممتع جدًا الجلوس والتفكير فيها بشكل منطقي وكتابة آلة حالة للمهمة التي بين يديك!

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

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