سيكون عكس تقدم التحليل أمرًا رائعًا.
سلوك متوقع:
إعادة كائن إلى التنسيق الذي تم تحليله.
السلوك الفعلي:
يمكنني فقط تحليل التنسيق ، وليس إعادة الكائن إلى التنسيق المحلل.
أهلا. لا أفهم هدف وسياق (سبب) طلبك. يمكن أن تساعد عينة ملموسة.
يتعرف التحليل على سلسلة باعتبارها جزءًا من اللغة ، ويمكنك اختياريًا إنشاء AST أو تقييم (تفسير) تعبير بالصيغة: parse(text) --> result
هذه الوظيفة _parse () _ ، بشكل عام ، ليست مضمونة لتكون دالة حيوية. لذلك ، لا يوجد ضمان يمكنك عكس التحليل ، حيث يمكنك تجاهل التفاصيل أثناء التحليل ، على سبيل المثال.
بالنظر إلى AST ، يمكنك إنشاء تعبيرات في نص مطابق للغة. يتم ذلك كجزء من إنشاء الكود ويمكنك استخدام محركات القوالب لتحويل ASTs إلى كود مصدر. لكن هذه المهمة خارج نطاق مكتبة التحليل.
على الرغم من أنني شخصيًا ، أفهم الشعور بالرغبة في أن يتمكن البرنامج من إنشاء ما يمكنه تحليله ، كما لخص pjmolina ، هذا خارج نطاق هذه المكتبة (مولد المحلل اللغوي) ، لذلك
أقترح عليك فقط إنشاء منشئ الكود الخاص بك ، عند استخدام واحد موجود للغة التي تقوم بتحليلها (عليك التأكد من صحة AST).
هذه التذكرة منطقية للغاية. ما هي المكتبة الأخرى التي تتوقع أن تحول ASTs إلى كود المصدر مع الأخذ في الاعتبار القواعد النحوية في بناء جملة PEG.js؟ نعم ، لا توجد طريقة حاليًا للقيام بذلك. يتم إنشاء معظم AST في الإجراءات ، ومن المستحيل التراجع عنها. ولكن عندما يكون هناك بناء جملة لجيل AST تحدثنا عنه في قضية مختلفة ، فإنه فجأة لا يكون منطقيًا فحسب ، بل من الممكن تنفيذه.
StringTemplate ، على سبيل المثال ، هي واحدة من العديد من الأدوات التي يمكنك استخدامها لمثل هذه المهمة: code-gen من ASTs.
لا أعتقد أن StringTemplate يقرأ القواعد النحوية في بناء جملة PEG.js.
للعودة إلى النص الأصلي ، لن يكون AST ( A bstract S yntax T ree) كافيًا. على سبيل المثال ، بالنظر إلى القواعد النحوية لهاتين الجملتين في JavaScript
عادةً ما يكون لها نفس AST على الرغم من اختلاف تركيبها قليلاً ،
// statement 1
var x = 5
// statement 2 - with semicolon
var x = 5;
لتكون قادرًا على العودة إلى النص الأصلي ، يجب أن تكون إجراءات المحلل اللغوي دالة حَقلية .
أنا شخصياً لا أرى كيف يمكن أن تكون هذه الميزة جزءًا من مكتبة التحليل
التي تعتمد على إجراءات المستخدمين المضمنة لإنشاء بنية الإخراج.
ربما في المستقبل إذا كان لدى pegjs نوع من إنشاء شجرة التحليل التلقائي
سيكون هذا ممكنا.
بافتراض أن معلومات الموضع الكاملة متاحة داخل الإجراءات المضمنة
يمكنك إدراج الإجراءات المضمنة المخصصة الخاصة بك لبناء CST / ParseTree
وتحويله فقط إلى AST في مرحلة ما بعد التحليل.
بمجرد حصولك على CST ، فإن إعادة إنشاء الإدخال الأصلي أمر تافه إلى حد ما ...
يمكنك العثور على عدة مرشحين هنا:
https://tomassetti.me/parsing-in-javascript/
لقد قررت أن ألقي نظرة أخرى على هذا ، ولكن يجب أن يكون بعد الإصدار 1 قبل أن يتم تنفيذه لأن هذه ستكون النقطة التي تكون فيها واجهة برمجة التطبيقات مستقرة ويمكنني إصدار حزمة توفر بنية AST أساسية مشتركة ( على سبيل المثال ، @pegjs/ast
؟). يمكن للمطورين المحلل استخدام هذه الحزمة لاشتقاق AST الخاص بهم ، وإذا لزم الأمر ، يمكن استخدامها لترجمتها مرة أخرى إلى المصدر بواسطة أداة أخرى (أفكر في @pegjs/reverse
)
futagoza كيف تسير الأمور مع هذا؟
@ Coffee2CodeNL pegjs v1 لم يخرج بعد.
خذ محلل تحويل SVG هذا في PEGJS على سبيل المثال: https://github.com/nidu/svg-transform-parser
سيكون من الرائع أن تكون قادرًا على عكس العملية وتحويل AST مرة أخرى إلى سلسلة ،
لذلك يمكن تعديل تحويلات SVG بسهولة ، وليس فقط تحليلها.
إحدى هذه الأدوات المشابهة هي Augeas .
هل يمكن لشخص أن يوصي ببعض الأدوات لإنشاء رمز من AST؟
lzane أي AST؟
@ polkovnikov-ph بعض AST المخصص الذي تم إنشاؤه بواسطة PEG
هل هناك أي أداة تقرأ قواعد PEG يمكنها القيام بمهمة إنشاء الكود؟
التعليق الأكثر فائدة
أهلا. لا أفهم هدف وسياق (سبب) طلبك. يمكن أن تساعد عينة ملموسة.
يتعرف التحليل على سلسلة باعتبارها جزءًا من اللغة ، ويمكنك اختياريًا إنشاء AST أو تقييم (تفسير) تعبير بالصيغة:
parse(text) --> result
هذه الوظيفة _parse () _ ، بشكل عام ، ليست مضمونة لتكون دالة حيوية. لذلك ، لا يوجد ضمان يمكنك عكس التحليل ، حيث يمكنك تجاهل التفاصيل أثناء التحليل ، على سبيل المثال.
بالنظر إلى AST ، يمكنك إنشاء تعبيرات في نص مطابق للغة. يتم ذلك كجزء من إنشاء الكود ويمكنك استخدام محركات القوالب لتحويل ASTs إلى كود مصدر. لكن هذه المهمة خارج نطاق مكتبة التحليل.