سؤال

هل يوجد محلل يقوم بإنشاء شجرة AST/تحليل في وقت التشغيل؟هل يشبه نوعًا ما مكتبة تقبل سلسلة من قواعد EBNF أو شيئًا مشابهًا وتنشر بنية البيانات؟

  • أنا على علم بـ antlr و jlex وأمثالهم.يقومون بإنشاء كود المصدر الذي يمكنه القيام بذلك.(مثل تخطي خطوة الترجمة)
  • أنا على دراية بـ Boost::Spirit، الذي يستخدم بعض السحر الأسود مع بناء جملة C++ لإنشاء مثل هذه الأشياء في وقت التنفيذ (بالتأكيد أقرب كثيرًا إلى ما أريد، لكنني أشعر بالدهشة عندما يتعلق الأمر بـ C++.ولا يزال الأمر مقيدًا إلى حد ما، لأن قواعدك النحوية مشفرة)
  • لست على علم بأي شيء في لغة بايثون أو روبي، على الرغم من أن المترجم قد يكون فعالًا جدًا في مثل هذه اللغة...

الآن أنا على علم بمجموعات المحلل اللغوي.(شكرًا، جوناس) وبعض المكتبات (شكرًا إليبين)

بالمناسبة، لاحظت أيضا تحليل قواعد التعبير في الآونة الأخيرة، يبدو الأمر رائعًا إذا قام شخص ما بتنفيذه (يقولون إن Perl 6 سيحصل عليه، لكن Perl يتهرب من فهمي)

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

المحلول

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

تتم كتابة واستخدام موزعي Combinator بنفس لغة البرمجة مثل بقية البرنامج.لا توجد فجوة بين الشكليات النحوية (Yacc) ولغة البرمجة الفعلية المستخدمة (C)

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

إذا كنت تستخدم .NET، فقم بإلقاء نظرة على مكتبة المترجم اللغوي لـ F#.

نصائح أخرى

إذا كانت Java هي الأفضل بالنسبة لك، فهناك منفذ لمكتبة Haskell Parsec - Jparsec.قوي جدًا، على الرغم من أن التوثيق ليس رائعًا.

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

الاشياء التواء الرأس.

نظرًا لأن كل شيء موجود في Java (المحلل اللغوي الخاص بك هو POJO)، يمكنك إعادة البناء والقيام بـ TDD وأي شيء اعتدت القيام به في Java.هذه ميزة كبيرة لنهج ANTLR/JavaCC/JJTree الأكثر تقليدية.

ناقش Lambda the Ultimate أ المحلل اللغوي الذي يسمح بامتدادات بناء الجملة.

أخطط لكتابة مترجم يسمح بامتدادات بناء الجملة (نوع من البرمجة الفوقية لوقت الترجمة).لا أريد أن يكون لدي نظام قوي جدًا، لذلك فكرت في الحصول على:

{syntax: while (condition) do code}
while (condition, code) => // actual execution

واستبدل كل نمط يطابق بناء الجملة باستدعاء للوظيفة.ومع ذلك، لا أعرف من أين أبدأ في تشغيل المعجم والمحلل اللغوي، لأن الأدوات المعتادة مثل Flex/Bison أو ANTLR (أود أن أكتب المترجم في C#) لا يبدو أنها تسمح بذلك.

هل يمكن أن تقدم لي أي اتجاه بشأن المكان الذي يجب أن أذهب إليه بعد ذلك؟لقد قرأت أيضًا أن Scheme أو Haskell يمكن أن تكونا لغات أفضل لتحقيق هذه المهمة.وبالطبع أنا منفتح على أي اقتراح حول الفكرة الفعلية لتنفيذها.

نعم بالطبع !

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

  • في لغة Perl، استخدم Parse::RecDescent.فهو يأخذ قواعده النحوية من سلسلة، ويمكنك بالتأكيد أن تطلب منه إنشاء محلل جديد من سلسلة جديدة في وقت التشغيل.
  • في بايثون، فكر في PLY.يمكنك بسهولة إنشاء الوظائف باستخدام سلاسل المستندات في وقت التشغيل وتشغيل PLY عليها.

أنا شخصيًا أوصي بخيار Python، على الرغم من أنه قد لا يكون ذا صلة إذا كنت تعرف لغة Perl ولكن ليس لغة Python.

للاكتمال، يجب أن أشير إلى أنه يمكنك القيام بذلك مع Lex & Yacc أيضًا، لكنه مشعر.سيتعين عليك إنشاء ملف Lex/Yacc من القواعد النحوية الخاصة بك في وقت التشغيل، وتجميعه إلى لغة C، وتجميعه في lib مشترك وتحميله في وقت التشغيل.يبدو هذا كالخيال العلمي، لكن بعض الأدوات تفعل ذلك بالفعل لتلبية احتياجات معقدة من الكفاءة والديناميكية.

حظ سعيد.

جي فليكس, ، ملحق JLex Java، يتيح لك إجراء تجميع وقت التشغيل، ولكنه أمر صعب للغاية.

ماذا ستحلل؟في C أو C++ لن يكون لديك محلل في وقت التشغيل، وبالتالي فهو غير متاح بدون مكتبة إضافية.وهذا صحيح بالنسبة للعديد من لغات البرمجة.

تكون كافة الموزعات "ديناميكية" بشكل افتراضي عند تنفيذها.حتى في ج.

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

[دروبينك.جافا] http://pfmiles.github.com/blog/dropincc-dot-Java-the-ultimate-tool-to-create-dsls-in-Java/ "Dropincc.java هو مولد محلل ديناميكي في جافا خالصة".

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

تحقق من الرابط هناك للحصول على مزيد من المعلومات.

[الصفحة الرئيسية للمشاريع] https://github.com/pfmiles/dropincc.java

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