سؤال

منذ بضعة أيام قرأت مقالاً في المدونة (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx) حيث يناقش المؤلف فكرة محلل DSL للغة الطبيعية العامة باستخدام .NET.

الجزء الرائع من فكرته، في رأيي، هو تحليل النص ومطابقته مع الفئات التي تستخدم نفس اسم الجمل.

ولنأخذ على سبيل المثال الأسطر التالية:

Create user user1 with email test@email.com and password test
Log user1 in
Take user1 to category t-shirts
Make user1 add item Flower T-Shirt to cart
Take user1 to checkout

سيتم تحويله باستخدام مجموعة من الكائنات "المعروفة"، والتي تأخذ نتيجة التحليل.بعض أمثلة الكائنات ستكون (باستخدام Java لمثالي):

public class CreateUser {
    private final String user;
    private String email;
    private String password;

    public CreateUser(String user) {
    this.user = user;
    }

    public void withEmail(String email) {
    this.email = email;
    }

    public String andPassword(String password) {
        this.password = password;
    }
}

لذلك، عند معالجة الجملة الأولى، ستكون فئة CreateUser متطابقة (من الواضح أنها سلسلة من "إنشاء مستخدم")، وبما أنها تأخذ معلمة على المنشئ، فإن المحلل اللغوي سيأخذ "user1" باعتباره معلمة المستخدم.

بعد ذلك، سيحدد المحلل أن الجزء التالي، "مع البريد الإلكتروني" يطابق أيضًا اسم الطريقة، وبما أن هذه الطريقة تأخذ معلمة، فسوف تقوم بتحليل "test@email.com" باعتبارها معلمة البريد الإلكتروني.

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

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

والأكثر من ذلك، إذا كان أي شخص على استعداد لبدء مشروع مفتوح المصدر لذلك، سأكون مهتمًا بالتأكيد.

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

المحلول

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

ستجد ANTLR في العديد من الأماكن بما في ذلك Eclipse وGroovy وGrails كبداية. المرجع النهائي ANTLR حتى أنه يجعل من السهل إلى حد ما التعجيل بالأساسيات بسرعة إلى حد ما.

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

حظ سعيد!

نصائح أخرى

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

تتمثل ميزة DSL (أو ينبغي أن تكون كذلك، على أي حال) في أنها بسيطة وواضحة، لكنها قوية فيما يتعلق بمجال المشكلة.إن محاكاة لغة طبيعية هي اهتمام ثانوي، وقد تؤدي في الواقع إلى نتائج عكسية على تلك الأهداف الأساسية.

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

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

قد ترغب في النظر Xtext, ، والذي يستخدم ANTLR داخليًا ويقوم ببعض الأشياء الرائعة مثل إنشاء محرر تلقائيًا لـ DSL الخاص بك.

المرة الأولى التي سمعت فيها عن DSL كانت من Jetbrains، مبتكر IntellJ Idea.

لديهم هذه الأداة: MPS (نظام البرمجة التعريفية)

قد تجد سلسلة المدونات متعددة الأجزاء هذه التي قمت بإنشائها باستخدام Antlr مفيدة كنقطة بداية.يستخدم Antlr 2، لذا ستكون بعض الأشياء مختلفة بالنسبة إلى Antlr 3:

http://tech.puredanger.com/2007/01/13/implementing-a-scripting-language-with-antlr-part-1-lexer/

العروض/المقالات التي يقدمها مارك فولكمان حول Antlr مفيدة جدًا أيضًا:

http://www.ociweb.com/mark/programming/ANTLR3.html

سأدعم الاقتراح الخاص بكتاب Definitive ANTLR، وهو ممتاز أيضًا.

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

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

على أية حال، التحقق من ذلك :)

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