مكتبة قواعد النحوية التعبير عن التحليل (PEGTL) عبارة عن مكتبة مشدّة رأس C ++ للاعتماد فقط لإنشاء محللات محلية وفقًا لقواعد التعبير عن التحليل (PEG).
أثناء تطوير نسخة رئيسية جديدة ، يمكن للفرع الرئيسي أن يمر بتغييرات غير متوافقة. للحصول على تجربة مستقرة ، يرجى تنزيل أحدث إصدار بدلاً من استخدام الفرع الرئيسي.
للأسئلة والاقتراحات المتعلقة بقصص PEGTL أو النجاح أو الفشل وأي نوع آخر من التعليقات ، لا تتردد في فتح مناقشة أو مشكلة أو طلب سحب ، أو الاتصال بالمؤلفين في taocpp(at)icemx.net .
تتم كتابة القواعد النحوية كرمز C ++ العادي ، تم إنشاؤه باستخدام برمجة القالب (وليس برمجة META القالب) ، أي مثيلات القالب المتداخلة التي تتوافق بشكل طبيعي مع التعريف الاستقرائي للأوتاد (وغيرها من أساليب المحلل المحلي).
يتم تضمين مجموعة شاملة من قواعد المحللات المحصنة التي يمكن دمجها وتوسيعها من قبل المستخدم ، وكذلك آليات لتصحيح قواعد الأخطاء ، وربط الإجراءات المعرفة من قبل المستخدم بقواعد القواعد. فيما يلي مثال على كيفية تنفيذ قاعدة قواعد التعبير عن التحليل كفئة C ++ مع PEGTL.
// PEG rule for integers consisting of a non-empty
// sequence of digits with an optional sign:
// sign ::= '+' / '-'
// integer ::= sign? digit+
// The same parsing rule implemented with the PEGTL:
using namespace tao ::pegtl ;
struct sign : one< ' + ' , ' - ' > {};
struct integer : seq< opt< sign >, plus< digit > > {};تتشابه الأوتاد بشكل سطحي مع القواعد النحوية الخالية من السياق (CFGs) ، ومع ذلك فإن الطبيعة الأكثر حتمية للأوتاد تؤدي إلى بعض الاختلافات المهمة للغاية. يجد تحليل القواعد المشمل العديد من الأخطاء النموذجية في الأوتاد ، بما في ذلك العودية اليسرى.
تم تصميم PEGTL ليكون "Lean and Mean" ، وتتكون المكتبة الأساسية من حوالي 6000 سطر من التعليمات البرمجية. ينصب التركيز على البساطة والكفاءة ، مفضلاً نهجًا بسيطًا جيدًا على التحسينات المعقدة.
يهتم PEGTL في الغالب بتوصيل المتجدات وقواعد القواعد ، ومع إعطاء مستخدم المكتبة (إمكانية) السيطرة الكاملة على جميع الجوانب الأخرى لتشغيل التحليل. ما إذا كانت الإجراءات التي يتم اتخاذها ، وما إذا كانت هياكل البيانات التي يتم إنشاؤها أثناء تشغيل التحليل ، متروكة تمامًا للمستخدم.
تشمل بعض الأمثلة على الموقف النموذجي مثل توصيل تسلسل الهروب في الأوتار ، وبناء بنية بيانات JSON العامة ، وتقييم على الحفل للتعبيرات الحسابية.
من خلال استخدام برمجة القالب وتخصصات القالب ، من الممكن كتابة قواعد اللغة مرة واحدة ، واستخدامها بطرق متعددة مع إجراءات مختلفة (دلالية) في عمليات التحليل المختلفة (أو نفسها).
مع الشكلية PEG ، عادة ما يتم إسقاط الفصل في مراحل Lexer و Larser - كل شيء يتم في قواعد واحدة. يتم التعبير عن القواعد في C ++ كمضامون قالب ، وهي مهمة التحويل البرمجي لتحسين قواعد PegTl.
يتم اختبار كل الالتزام تلقائيًا مع بنيات متعددة وأنظمة التشغيل والمترجمين والإصدارات منها.
يتم التحقق من كل التزام مع مطعم GCC و Clang ، ومحلل Clang الثابت ، و clang-tidy . بالإضافة إلى ذلك ، نستخدم CodeQL لمسح مشكلات (الأمان).
يتم قياس تغطية الكود تلقائيًا وتغطي اختبارات الوحدة 100 ٪ من رمز المكتبة الأساسية (للإصدارات).
تتم الإصدارات وفقًا للنسخة الدلالية. يُسمح بتغييرات API غير المتوافقة فقط بين الإصدارات الرئيسية.
وفقًا لجميع المساهمات هنا ، فإن الأشخاص الذين ساهموا بشكل مباشر في PEGTL و/أو تطوره.
Pegtl هو جزء من فن C ++.
حقوق الطبع والنشر (C) 2007-2023 دانييل فراي والدكتور كولين هيرش
تم اعتماد PEGTL برنامج مفتوح المصدر. وهي مرخصة بموجب شروط ترخيص برنامج Boost ، الإصدار 1.0 مستنسخ هنا.
Boost Software License - الإصدار 1.0 - 17 أغسطس 2003
يتم منح الإذن بموجب هذا ، مجانًا ، لأي شخص أو مؤسسة تحصل على نسخة من البرنامج والوثائق المصاحبة التي يغطيها هذا الترخيص ("البرنامج") لاستخدام البرنامج الثالث وإعادة إنتاجه وتوزيعه وتنفيذه ونقله ، وإعداد الأعمال المشتقة للبرنامج ، والسماح بمنفات البرامج الثالثة إلى ما يلي ذلك ، كله خاضعًا للاتصالات التالية:
يجب أن يتم تضمين إشعارات حقوق الطبع والنشر في البرنامج وهذا البيان بأكمله ، بما في ذلك منحة الترخيص أعلاه ، وهذا التقييد وإخلاء المسئولية التالية ، في جميع نسخ البرنامج ، كليًا أو جزئيًا ، وجميع الأعمال المشتقة للبرنامج ، ما لم تكن هذه النسخ أو الأعمال المشتقة فقط في شكل كود كائن قابلة للتنفيذ تم إنشاؤه بواسطة معالجة لغة المصدر.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعنوان وعدم التعبير. لا يجوز بأي حال من الأحوال أن يتحمل حاملي حقوق الطبع والنشر أو أي شخص يوزع البرنامج مسؤولية أي أضرار أو أي مسؤولية أخرى ، سواء في العقد أو الضرر أو غير ذلك ، ناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو غيرها من المعاملات في البرنامج.