ماذا لو لم يكن هناك محلل ثابت للغة المفضلة لديك؟

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


بالمناسبة ، هل تعرف ما الذي يمكن أن يقلل جودة قاعدة الشفرة التي تم الحصول عليها من سلسلة من طلبات السحب المثالية؟ حقيقة أن المبرمجين الخارجيين قاموا بنسخ أجزاء من كود المشروع الموجود في تصحيحاتهم بدلاً من التجريد المختص. يجب أن تعترف أنه ، إلى حد ما ، يصعب عليك أن تفهم مثل هذا النوع من التفاهات أكثر من كونه رمزًا رديء الجودة - فهو عالي الجودة وقد تم تصحيحه بالفعل بعناية ، لذلك لا يكفي التحقق المحلي هنا ، يجب عليك أن تضع قاعدة الشفرات بأكملها في الاعتبار ، لكن هذا ليس بالأمر السهل على أي شخص ... لذا: إذا إن إضافة الدعم الكامل لـ Modelica (دون إنشاء قواعد محددة) إلى الحالة "يمكن تشغيل الاختبارات البدائية" استغرق مني حوالي أسبوع ، ثم غالبًا ما يمكن إضافة دعم للكشف عن النسخ فقط في يوم واحد!


ماذا هو Modelica؟


Modelica ، كما يوحي الاسم ، هي لغة لكتابة نماذج من النظم المادية. في الواقع ، ليس فقط فيزيائيًا: من الممكن وصف العمليات الكيميائية ، والسلوك الكمي لمجموعات الحيوانات ، وما إلى ذلك - التي توصفها أنظمة المعادلات التفاضلية للشكل der(X) = f(X) ، حيث X هي متجه المجهول. ويدعم أيضا القطع الضرورية من التعليمات البرمجية. لا يتم دعم المعادلات التفاضلية الجزئية بشكل صريح ، لكن من الممكن تقسيم منطقة الدراسة إلى أجزاء (كما ربما كنا قد قمنا ببعض اللغات للأغراض العامة) ، ثم اكتب المعادلات لكل عنصر ، مما قلل المشكلة إلى الأولى. خدعة Modelka هي أن الحل الخاص بـ der(X) = f(X) يكمن في المحول البرمجي: يمكنك فقط تغيير المحول في الإعدادات ، ولا يجب أن تكون المعادلة خطية ، إلخ. باختصار ، هناك بعض الإيجابيات (كتبت الصيغة من الكتاب المدرسي - وأنها عملت) ، وسلبيات (مع مزيد من التجريد ، نحصل على سيطرة أقل). مقدمة إلى Modelika هي موضوع مقالة منفصلة (والتي ظهرت بالفعل عدة مرات على Habré) ، وحتى دورة كاملة ، تهمني اليوم كمنفتحة ولديها العديد من التطبيقات ، ولكن ، للأسف ، لا يزال معيارًا رطبًا.


بالإضافة إلى ذلك ، لدى Modelika ، من ناحية ، تصنيف ثابت (سيساعدنا على كتابة بعض التحليلات ذات مغزى بشكل أسرع) ، من ناحية أخرى ، عند إنشاء نموذج ، لا يُطلب من المحول البرمجي التحقق من المكتبة بالكامل بالكامل (لذلك ، فإن أداة التحليل الثابتة مفيدة جدًا لالتقاط "النوم" البق). أخيرًا ، على عكس بعض C ++ ، التي توجد بها سحابة من المحللون الجامعون والمُجمِّعون المتميزون ، والأهم من ذلك بالتفصيل ، راجع قوالب C ++ تشخيص الأخطاء ، المجمعين لا تزال النماذج تولد بشكل دوري خطأ مترجم داخلي ، مما يعني أن هناك مجالًا لمساعدة المستخدم حتى مع وجود محلل بسيط إلى حد ما.


ما هو PMD؟


سأجيب أغنية بالدراجة. ذات مرة أردت تقديم طلب سحب صغير في بيئة التطوير لبرنامج OpenModelica. عندما رأيت كيف تتم معالجة عملية حفظ النموذج في جزء آخر من الشفرة ، لاحظت وجود جزء صغير غير واضح للغاية من أربعة أسطر من الرموز التي تدعم نوعًا ثابتًا. لا أفهم ما هو نوع المحرر الداخلي الذي يتفاعل معه ، لكن مع إدراك أنه من وجهة نظر هذه الشفرة ، فإن مهمتي متطابقة تمامًا ، لقد وضعت في وظيفة حتى أتمكن من إعادة استخدامها وعدم كسرها. قال مينتينر ، إنه لأمر رائع ، عندها فقط استبدل هذا الكود بمكالمة وظيفية في الأماكن العشرين المتبقية ... قررت عدم التورط بعد ، وأعدت نسخة أخرى ، مشيرةً إلى أنني سأحتاج بعد ذلك بطريقة ما إلى تمشيط كل شيء مرة واحدة دون خلط مع التصحيح الحالي. غوغلينغ ، لقد وجدت كاشف نسخ اللصق (CPD) - جزء من محلل ثابت PMD - والذي يدعم لغات أكثر من محلل نفسه. بعد أن وضعتها على قاعدة الشفرة OMEdit ، كنت أتوقع أن أرى تلك القطع المكونة من عشرين قطعة من أربعة أسطر. أنا فقط لم أرهم (لم يتجاوز كل منهم الحد الفاصل في عدد الرموز) ، لكنني رأيت ، على سبيل المثال ، تكرار ما يقرب من خمسين سطرًا من شفرة C ++. كما قلت بالفعل ، من غير المرجح أن يقوم المُنسق ببساطة بنسخ قطعة عملاقة من ملف آخر. لكنه يمكن أن يفوتك هذا بسهولة في العلاقات العامة - لأن الشفرة ، بحكم تعريفها ، تفي بالفعل بجميع معايير المشروع! عندما شاركت الملاحظة مع الطبيب ، وافق على أنه سيكون من الضروري التنظيف كجزء من مهمة منفصلة.


وفقًا لذلك ، فإن كاشف أخطاء البرنامج (PMD) هو محلل ثابت سهل الامتداد. ربما لا يقوم بحساب مجموعة القيم التي يمكن أن يتخذها المتغير (على الرغم من من يعرف ...) ، ولكن لإضافة قواعد إليه ، لا تحتاج حتى إلى معرفة Java وتغيير الكود بطريقة ما! الحقيقة هي أن أول شيء يقوم به ، وليس من المستغرب ، هو إنشاء ملفات AST مع أكواد المصدر. وكيف تبدو شجرة تحليل المصدر؟ إلى شجرة تحليل XML! لذلك ، يمكنك وصف القواعد ببساطة مثل طلبات XPath - التي تتطابق معها ، ثم نصدر تحذيرًا. لديهم حتى مصحح رسومية للقواعد! بالطبع ، يمكن كتابة قواعد أكثر تعقيدًا مباشرة في Java كزائرين لـ AST.


النتيجة : يمكن استخدام PMD ليس فقط للقواعد القاسية والعالمية التي التزم بها مبرمجو Java القاسيون لرمز المحلل ، ولكن أيضًا لنمط الترميز المحلي - حتى إذا قمت بدفع ruleset.xml المحلي الخاص بك في كل مستودع!


المستوى 1: العثور على نسخ لصق تلقائيًا


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


  • تم تطوير المحلل (PMD و CPD) على جيثب في مستودع pmd / pmd
  • تم نقل مصحح أخطاء القاعدة المرئية إلى مستودع مصمم pmd / pmd منفصل. يرجى ملاحظة أن اسم الجرة النهائي يتم تضمينه تلقائيًا في التوزيع الثنائي لـ PMD ، والذي سيجمعه Gradle لك في المستودع السابق ، ولا تحتاج إلى استنساخ pmd-designer خصيصًا لهذا pmd-designer .
  • يحتوي المشروع على وثائق المطور . الشخص الذي قرأته كان مفصلاً للغاية. صحيح ، عفا عليها الزمن بعض الشيء ، ولكن هذا يعامل بواسطة طلب السحب الثاني :)

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


لذلك ، لإضافة لغة جديدة إلى وثيقة البرنامج القطري ، تحتاج فقط إلى ...


  • تنبيه: إذا كنت ترغب في الحصول على دعم كامل لـ PMD قبل إصدار PMD 7 ، فمن الأفضل أن تذهب مباشرة إلى المستوى 2 ، لأن الدعم العادي للطريقة السهلة من خلال قواعد Antlr النهائية سيظهر ، وفقًا للشائعات ، في الإصدار 7 ذاته ، ولكن في الوقت الحالي ، ستقضي الوقت فقط (على الرغم من وقليلا ...)
  • شوكة مستودع pmd / pmd .
  • ابحث في antlr / grammars-v4 عن قواعد جاهزة لغتك - بالطبع ، إذا كانت اللغة داخلية ، فيجب عليك كتابتها بنفسك ، ولكن بالنسبة إلى Modelika ، على سبيل المثال ، تم العثور عليها. هنا ، بالطبع ، تحتاج إلى الامتثال للإجراءات مع التراخيص - لست محامياً ، لكن على الأقل أحتاج إلى تحديد المصدر الذي قمت بنسخه منه.
  • بعد ذلك ، تحتاج إلى إنشاء الوحدة النمطية pmd-<your language name> ، وإضافتها إلى Gradle ووضع ملف القواعد هناك. علاوة على ذلك ، بعد قراءة صفحتين من الوثائق غير المجهدة ، أعد كتابة النص البرمجي للتجميع من الوحدة النمطية لـ Go ، وهما فصول لتحميل الوحدة من خلال الانعكاس ، حسنًا ، لا يوجد شيء ...
  • صحح الإخراج المرجعي في أحد الاختبارات ، لأن الآن CPD يدعم لغة أخرى! كيف تجد هذا الاختبار؟ سهل للغاية: يريد كسر البناء .
  • PROFIT! إنه أمر بسيط حقًا بشرط وجود قواعد نحوية جاهزة

الآن ، في جذر مستودع pmd ، يمكنك كتابة ./mvnw clean verify ، بينما في pmd-dist/target ستحصل ، من بين أمور أخرى ، على التوزيع الثنائي في شكل أرشيف مضغوط تحتاج إلى فك الضغط والتشغيل باستخدام ./bin/run.sh cpd --minimum-tokens 100 --files /path/to/source/dir --language <your language name> من الدليل الذي تم فك حزمه. من حيث المبدأ ، يمكنك القيام ../mvnw clean verify من داخل الوحدة النمطية الجديدة الخاصة بك ، والتي ستسرع التجميع بشكل كبير ، ولكن بعد ذلك سوف تضطر إلى وضع لقب الجرة المجمعة بشكل صحيح في التوزيع الثنائي غير المحزم (على سبيل المثال ، يتم التجميع مرة واحدة بعد تسجيل وحدة نمطية جديدة).


المستوى 2: العثور على الأخطاء وانتهاكات دليل النمط


كما قلت ، تم تقديم الدعم الكامل لـ Antlr في PMD 7 . إذا كنت ، مثلي ، لا ترغب في انتظار إصدار البحر ، فسيتعين عليك الحصول على وصف لقواعد اللغة بتنسيق JJTree من مكان ما. ربما يمكنك تشديد دعم محلل تعسفي بنفسك - تقول الوثائق إن هذا ممكن ، لكنهم لا يخبرون كيف بالضبط ... لقد أخذت فقط modelica.g4 من نفس المستودع مع القواعد النحوية لـ Anltr كأساس ، ثم أعده يدويًا إلى JJTree. بطبيعة الحال ، إذا تحولت القواعد إلى معالجة للنظام الحالي ، مرة أخرى ، يرجى الإشارة إلى المصدر والتحقق من الامتثال للتراخيص و. ر. د.


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


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


  • أولاً ، يفترض رمز وصف محلل JavaCC إدراج Java الذي سيتم إدراجه في المحلل اللغوي الذي تم إنشاؤه
  • لا تشوشك حقيقة أنه عند إنشاء AST ، فإن بناء الجملة مثل [ Expression() ] يعني اختياريًا ، وفي سياق وصف الرموز - اختيار حرف ، كما هو الحال في تعبير عادي. بقدر ما أفهم تفسير مطوري PMD ، فهذه إنشاءات متشابهة لها معنى مختلف - إرث ، سيدي ...
  • بالنسبة لعقدة الجذر (في حالتي ، StoredDefinition ) ، يجب عليك تحديد نوعها بدلاً من void (أي ASTStoredDefiniton )
  • باستخدام بناء الجملة #void بعد اسم العقدة ، يمكنك إخفائه من الشجرة التي تم تحليلها (أي أنها ستؤثر فقط على ما هو المصدر الصحيح وما هو غير صحيح ، وكيف سيتم تداخل العقد الأخرى)
  • باستخدام إنشاء النموذج void SimpleExpression() #SimpleExpression(>1) يمكننا القول أنه يجب إظهار العقدة في AST الناتج ، إذا كان لديها أكثر من سليل واحد. هذا مناسب جدًا عند وصف التعبيرات مع العديد من المشغلين ذوي الأولويات المختلفة: أي من وجهة نظر المحلل اللغوي ، فإن الثابت الوحيد 1 سيكون مثل LogicExpression(AdditiveExpression(MultiplicativeExperssion(Constant(1)))) - أدخل جميع مستويات أولويات التشغيل سوف تحصل على رمز محلل Constant(1) فقط Constant(1)
  • تحتوي العقدة على image متغيرة قياسية (انظر getImage ، setImage ) ، والتي عادةً ما setImage "جوهر" هذه العقدة: على سبيل المثال ، بالنسبة لعقدة مقابلة لاسم المتغير المحلي ، يكون من المنطقي نسخ الرمز المميز المتطابق مع المعرف في image (افتراضيًا ، كل الرموز من سيتم رمي الأشجار بعيدًا ، لذلك يجدر نسخ المعنى الموجود فيها ، على أي حال ، إذا كان هناك شيء متغير ، وليس مجرد كلمات رئيسية)
  • لوكاهيد - حسنًا ، هذه أغنية منفصلة ، وحتى الفصل المنفصل في الوثائق مخصص لها
    • تحدث تقريبًا ، في JavaCC ، إذا ذهبت إلى العقدة ، لا يمكنك التخلص منها ومحاولة تحليلها بشكل مختلف ، ولكن يمكنك التطلع إلى الأمام مقدمًا وتحديد ما إذا كنت تريد الذهاب أم لا.
    • في أبسط الحالات ، عند رؤية تحذير JavaCC ، أنت فقط تقول في الرأس LOOKAHEAD = n وستحصل على أخطاء تحليل غامضة ، لأنه في الحالة العامة ، على ما يبدو ، لا يمكن حل جميع المشكلات (حسنًا ، باستثناء أنه من خلال وضع بضعة مليارات من الرموز ، فإنك تحصل بالفعل على معاينة لكل شيء ، ولكن ليس حقيقة أنه يعمل بهذه الطريقة .. ).
    • أمام اسم العقدة المدمجة ، يمكنك الإشارة بوضوح إلى عدد الرموز التي يمكنك بالتأكيد اتخاذ القرار النهائي بها
    • إذا لم يكن هناك عدد محدد من الرموز المميزة في الحالة العامة ، فيمكنك أن تقول "اذهب هنا ، إذا كان سابقًا ، بدءًا من هذه النقطة ، تمكنا من مطابقة هذه البادئة - ثم الوصف المعتاد للشجرة الفرعية"
    • كن حذرًا: في الحالة العامة ، لا يمكن لـ JavaCC التحقق من صحة توجيهات LOOKAHEAD - إنها تثق بك ، لذلك على الأقل تكتشف الدليل الرياضي الذي يجعل مثل هذه الواجهة كافية ...

الآن بعد أن لديك وصف لقواعد اللغة في تنسيق JJTree ، ستساعدك هذه الخطوات البسيطة الـ 14 على إضافة دعم لغوي. معظمهم لديهم النموذج "إنشاء فئة مماثلة لتطبيق جافا أو VM ، ولكن تكييفها." سألاحظ فقط الميزات النموذجية ، سيظهر بعضها في الوثائق الرئيسية إذا قبلوا طلب السحب الخاص بالوثائق :


  • تعليقًا على إزالة جميع الملفات التي تم إنشاؤها في البرنامج النصي التجميع alljavacc.xml (الموجود في الوحدة النمطية الجديدة) ، يمكنك نقلها إلى شجرة المصدر من المصادر target/generated-sources . لكن الأفضل لا. على الأرجح ، لن يتم تغيير سوى جزء صغير ، لذلك من الأفضل الاهتمام بحذف عدد قليل فقط: لقد رأوا الحاجة إلى تغيير التطبيق الافتراضي ، المنسوخ إلى شجرة المصدر ، تمت إضافته إلى قائمة الملفات المحذوفة ، أعيد بناؤها - والآن تقوم بإدارة الملف - وتحديداً هذا الملف . خلاف ذلك ، سيكون من الصعب معرفة ما تم تغييره بالضبط ، ولا يمكن وصف الدعم على أنه لطيف.
  • الآن بعد أن أصبح لديك تطبيق لوضع PMD "الرئيسي" ، يمكنك تعليق محلل JJTree بسهولة على CPD أيضًا ، على غرار Java أو بعض التطبيقات الأخرى المتاحة
  • تذكر أن تقوم بتطبيق طريقة تقوم بإرجاع اسم المضيف لاستعلامات XPath. في التطبيق الافتراضي ، يتم الحصول على التكرار غير المحدود (اسم العقدة هو من خلال toString والعكس بالعكس) ، أو أي شيء آخر ، بشكل عام ، بسبب هذا ، لا يمكن أيضًا النظر إلى الشجرة في PMD Designer ، وتصحيح القواعد النحوية بدونها
  • يتم جزء من تسجيل المكونات عن طريق إضافة ملفات نصية من نقاط إدخال اسم فئة مؤهلة بالكامل إلى META-INF/services
  • ما يمكن وصفه بشكل تعريفي في القواعد (على سبيل المثال ، وصف تفصيلي للشيك وأمثلة من الأخطاء) ليس موصوفًا في الكود ، ولكن في category/<language name>/<ruleset>.xml - في أي حال ، سيكون عليك تسجيل القواعد هناك
  • ... ولكن عند تنفيذ الاختبارات ، على ما يبدو ، فإن بعضًا من آلية الاكتشاف التلقائي التي يتم تطويرها محليًا تُستخدم بنشاط
    • إذا قيل لك ، "أضف اختبارًا تافهًا لكل نسخة من اللغة" - من الأفضل عدم المجادلة ، فإنهم يقولون "لا أحتاج إليها ، إنها تعمل بهذه الطريقة" - ربما هذه هي آلية الاكتشاف التلقائي
    • إذا رأيت اختبارًا لقاعدة معينة تتضمن نصًا دراسيًا يحتوي فقط على تعليق // no additional unit tests ، فهذه ليست اختبارات ، فهي تكمن فقط في الموارد في شكل وصف XML لبيانات المدخلات وردود الفعل المتوقعة للمحلل ، فورًا: بعض الاختبارات الصحيحة وبعض الأمثلة غير صحيحة.

مسعى صغير ولكنه مهم: أنهى مصمم PMD


ربما يمكنك تصحيح كل شيء دون متخيل. لكن لماذا؟ أولا ، لإنهاء الأمر بسيط جدا. ثانيًا ، سيساعد المستخدمين الذين ليسوا على دراية بجافا إلى حد كبير: فهم سهلون وبسيطون (إذا كان هذا ينطبق على XPath على الإطلاق) ، أو ، أو على الأقل بدون إعادة تجميع PMD ، سيكون بإمكانهم وصف أنماط بسيطة لما لا يحبونه (في أبسط الحالات - دليل الأنماط مثل "اسم حزمة النموذج يبدأ دائمًا بحرف صغير").


بخلاف الأخطاء الأخرى المرئية على الفور ، فإن مشكلات PMD Designer غديرة للغاية: يبدو أنك قد فهمت بالفعل أن نقش Java على الجانب الأيمن من القائمة ليس زرًا ، بل قائمة منسدلة من اختيار لغة O_o ، والتي ظهرت فيها بالفعل Modelica ، لأنه قد ظهرت وحدة نمطية جديدة مع تسجيل نقاط الدخول في classpath. ولكن هنا تختار لغتك ، وتنزيل ملف اختبار ، ومشاهدة AST. ويبدو أنه انتصار ، لكنه أبيض وأسود بطريقة أو بأخرى ، ويمكن تسليط الضوء على الشجرة الفرعية المميزة في النص - على الرغم من لا ، هناك تسليط الضوء ، ولكن يتم تحديثه بشكل ملتوي - ومع ذلك ، كيف لم يخمنوا تسليط الضوء على التطابقات التي تم العثور عليها مع XPath ... إذا قمت بالفعل بتقدير حجم العمل ، فأنت تفكر في طلب السحب التالي ، ولكن بعد ذلك قررت بالصدفة تبديل اللغة إلى Java وتنزيل بعض الكود المصدري لـ PMD نفسه ... أوه! إنه ملون! .. ويعمل تسليط الضوء على الشجرة الفرعية! أه ... وتبين أنه يسلط الضوء عادةً على التطابقات التي عثر عليها ويكتب أجزاء من النص في المربع على يمين الطلب ... يبدو الأمر وكأنه يحدث عند حدوث استثناء في كود JavaFX أثناء تقديم الواجهة ، فإنه يقاطع العرض ، لكنه لا يطبع إلى وحدة التحكم ...


بشكل عام ، تحتاج فقط إلى إضافة فئة ma-a-scarlet لتسليط الضوء على بناء الجملة على أساس التعبيرات العادية. في حالتي ، كان net.sourceforge.pmd.util.fxdesigner.util.codearea.syntaxhighlighting.ModelicaSyntaxHighlighter ، والذي يحتاج إلى تسجيله في فئة AvailableSyntaxHighlighters . يرجى ملاحظة أن كلا من هذه التغييرات تحدث في مستودع pmd-designer ، حيث يجب وضع قطعة تجميعها في التوزيع الثنائي.


في النهاية ، يبدو مثل هذا (GIF مأخوذ من README في مستودع مصمم PMD):


PMD مصمم في العمل


حاصل الجمع


إذا كنت قد أكملت كل هذه المستويات ، فأنت الآن:


  • نسخة كاشف لصق
  • محرك القواعد
  • متخيل للتصحيح AST وجعله في شكل مناسب للتحليل (كما رأينا بالفعل ، ليست كل القواعد النحوية من نفس اللغة مفيدة على قدم المساواة!)
  • نفس متخيل تصحيح قواعد XPath التي يمكن للمستخدمين أن يكتبوها دون إعادة ترجمة PMD ومعرفة Java بشكل عام (XPath ، بالطبع ، ليست أيضًا BASIC ، ولكنها على الأقل لغة استعلام قياسية وليست لغة محلية)

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


القصة لا تنتهي عند هذا الحد: على الأقل يجب كتابة بعض القواعد المفيدة.


ولكن هذا ليس كل شيء: تدعم PMD أصلاً النطاقات والإعلانات. كل عقدة AST لها نطاق مرتبط بها: نص الفئة ، الوظيفة ، الحلقة ... الملف بأكمله ، في أسوأ الأحوال! وفي كل مجال توجد قائمة بالتعاريف (الإعلانات) التي تحتوي عليها مباشرة. كما هو الحال في الحالات الأخرى ، يُقترح أن يتم ذلك عن طريق القياس باللغات الأخرى ، على سبيل المثال ، Modelika (ولكن في وقت كتابة هذا التقرير ، كان المنطق في طلب السحب الخاص بي ، بصراحة تامة ،). scopes declarations visitor, - ScopeAndDeclarationFinder , — , , , - , read-only AST. , .


 public class ModelicaHandler extends AbstractLanguageVersionHandler { // ... @Override public VisitorStarter getSymbolFacade() { return new VisitorStarter() { @Override public void start(Node rootNode) { new SymbolFacade().initializeWith((ASTStoredDefinition) rootNode); } }; } } 

استنتاج


PMD . , «» Clang Static Analyzer , . , CPD ( ), .

Source: https://habr.com/ru/post/ar474920/


All Articles