سؤال

وبصرف النظر عن إنجاز أي عمل حقيقي، لدي حكة.رغبتي في كتابة محرك عرض يحاكي بشكل وثيق نظام القالب من لغة أخرى (Template Toolkit/Perl).هذه واحدة من تلك الأشياء التي إذا كان لدي الوقت/أقوم بها لتعلم نوع جديد من المشاريع.

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

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

هل هناك أي موارد جيدة للمبتدئين لهذا النوع من الأشياء؟لقد حصلت على ganer في Spark، والتي لا يبدو أنها تحتوي على القواعد النحوية في الريبو.

ربما يكون هذا مبالغة، ويمكن للمرء فقط اختبار بناء جملة القالب بـ c# في الملف وتجميعه. http://msdn.microsoft.com/en-us/magazine/cc136756.aspx#S2

إذا كنت مكاني ولم تكن خبيرًا في إنشاء اللغات، فمن أين ستبدأ؟

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

المحلول

يتم تنفيذ قواعد Spark باستخدام لغة محددة للمجال تجيد اللغة.

تم الإعلان عنه في بضع طبقات.تم الإعلان عن القواعد التي تتعرف على بناء جملة html MarkupGrammar.cs - تعتمد هذه القواعد على القواعد النحوية المنسوخة مباشرة من مواصفات XML.

تشير قواعد الترميز إلى مجموعة فرعية محدودة من قواعد بناء جملة csharp المعلنة في CodeGrammar.cs - هذه مجموعة فرعية لأن Spark تحتاج فقط إلى التعرف على ما يكفي من csharp لضبط علامات الاقتباس المفردة حول السلاسل مع علامات الاقتباس المزدوجة، ومطابقة الأقواس المتعرجة، وما إلى ذلك.

القواعد الفردية نفسها هي من النوع مندوب ParseAction<TValue> التي تقبل أ موضع وعودة أ ParseResult.ParseResult عبارة عن فئة بسيطة تحتوي على عنصر بيانات TValue الذي تم تحليله بواسطة الإجراء ومثيل موضع جديد تم تطويره بعد المحتوى الذي أنتج TValue.

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

تقنية استخدام المفوض كإجراء تحليلي جاءت من منشور مدونة Luke H Monadic Parser Combinators باستخدام C# 3.0.لقد كتبت أيضًا مقالًا عنه إنشاء لغة خاصة بالمجال للتحليل.

من الممكن أيضًا، إذا أردت، الرجوع إلى مجموعة Spark.dll ووراثة فئة من CharGrammar الأساسي لإنشاء قواعد نحوية جديدة تمامًا لبناء جملة معين.ربما تكون هذه هي الطريقة الأسرع لبدء تجربة هذه التقنية، ويمكن العثور على مثال على ذلك في CharGrammarTester.cs.

نصائح أخرى

والخطوة 1. استخدام التعابير العادية (التعبير العادي الاستبدال) لتقسيم سلسلة قالب الإدخال إلى قائمة رمزية، على سبيل المثال، تقسيم

hel<b>lo[if foo]bar is [bar].[else]baz[end]world</b>!

إلى

write('hel<b>lo')
if('foo')
write('bar is')
substitute('bar')
write('.')
else()
write('baz')
end()
write('world</b>!')

والخطوة 2. تحويل قائمة رمزية لشجرة بناء الجملة:

* Sequence
** Write
*** ('hel<b>lo')
** If
*** ('foo')
*** Sequence
**** Write
***** ('bar is')
**** Substitute
***** ('bar')
**** Write
***** ('.')
*** Write
**** ('baz')
** Write
*** ('world</b>!')

class Instruction {
}
class Write : Instruction {
  string text;
}
class Substitute : Instruction {
  string varname;
}
class Sequence : Instruction {
  Instruction[] items;
}
class If : Instruction {
  string condition;
  Instruction then;
  Instruction else;
}

والخطوة 3. اكتب دالة متداخلة (تسمى مترجم)، والتي يمكن المشي شجرة الخاص بك وتنفيذ تعليمات هناك.

وآخر، نهج بديل (بدلا من الخطوات 1--3) إذا تدعم لغتك حدة التقييم () (مثل بيرل، بيثون، روبي): استخدام استبدال التعبير العادي لتحويل القالب إلى وحدة التقييم () - سلسلة قادرة في اللغة المضيفة، وتشغيل وحدة التقييم () لإنشاء مثيل القالب.

وهناك العديد من سوو شيء للقيام به. ولكن يعمل لفي بيان GET بسيط بالإضافة إلى اختبار. هذا هو بداية.

http://github.com/claco/tt.net/

في النهاية، أنا بالفعل الكثير من الوقت في ANTLR لإعطاء طريقة loudejs 'الذهاب. أردت أن تنفق المزيد من الوقت على العملية برمتها بدلا من محلل / lexer. ربما في الإصدار 2 I يمكن أن يكون الذهاب في الطريق سبارك عندما يفهم ذهني أشياء أكثر من ذلك بقليل.

فيشي محلل (والمعروف سابقا باسم LazyParser.NET) هو مفتوح المصدر tokenizer / قالب محلل / تعبير محلل التي يمكن أن تساعدك على البدء.

إذا لم يكن هذا ما كنت أبحث عنه، ثم قد تحصل على بعض الأفكار من خلال النظر في شفرة المصدر.

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