تمديد منصة اختبار الواجب المنزلي لتضمين تحليل التعليمات البرمجية (C/C ++)

StackOverflow https://stackoverflow.com/questions/3710532

سؤال

أنا أحافظ/تطوير منصة لاختبار الواجبات المنزلية. إنه في الغالب تلقائي. ما أحتاج إلى إضافته الآن هو تحليل التعليمات البرمجية. أحتاج إلى التحقق من الكود للحصول على بنيات محددة.

فمثلا:

هل الملف main.cpp تحتوي على فصل اسمه user مع طريقة const get_name()?

هل هناك بعض الأدوات التي من شأنها أن تسمح لي بالقيام بمثل هذه الأشياء (سيكون مثاليًا شيئًا يمكن نصه). Linux فقط.

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

المحلول 4

لقد اكتشفت أداة dehydra من Mozilla. يبدو أنه مكتوب في الغالب لأغراض داخلية ، ولكن قد يكون بالضبط ما كنت أبحث عنه.

https://developer.mozilla.org/en/dehydra/using_dehydra

تحرير: Dehydra رائع. إنه يفتقد بعض الميزات البسيطة مثل تحديد أساليب const ، ولكن رائع.

نصائح أخرى

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

ربما يمكنك اختراق شيء استخدم إطار عمل GCC-XML بدون صعوبة كبيرة.

كيف ينطبق هذا على C? :)

هل يحتوي الملف Main.cpp على فئة اسمها مستخدم مع طريقة const get_name ()؟

إنشاء ملف آخر (test.cpp) مع

void test(void) {
  const user x;
  x.get_name();
}

تجميع test.cpp و main.cpp معا. إذا كان هناك خطأ (رمز الخروج! = 0) ثم رقم!, ، لا يحدد ملف File Main.cpp فئة (عامة) اسمها مستخدم مع الطريقة المحددة.

التحذير: لا أعرف لا C++, ، لذلك اعذر أي أخطاء رئيسية (أو ثانوية) في ما سبق.


يحرر أضاف النص

#! /bin/sh

cat main.c test.c > 3710532.c
if gcc 3710532.c > /dev/null 2>&1
then echo OK
else echo BZZZT
fi
rm 3710532.c

ليس لدي جهاز جاهز للاستخدام C++ برنامج التحويل البرمجي المثبت على هذا الجهاز الذي أنا عليه ، لذلك كان الاختبار مع أ C المترجم و C الملفات. لم يكن برنامج التحويل البرمجي "يعمل مع" gcc -combine main.c test.c لذلك قمت بتعديل هذا الجزء.

تشغيل هذا البرنامج النصي مع مزيج عمل من main.c و test.c مخرجات "موافق" ، وإلا فإنه يخرج "bzzzt".


للاختبارات التي استخدمتها هذا main.c

typedef int user;

int get_name(void) {
  return 0;
}

int main(void) {
  return 0;
}

وهذا test.c

void test(void) {
  const user x;
  get_name();
}

تشغيل العينة

$ ./3710532.sh
OK

إذا كنت ترغب في إجراء تحليل رمز تعسفي ، فأنت بحاجة إلى تحليل/مطابقة تعسفي/إلخ. سيعطيك GCC-XML معلومات الإعلان ، ولكن ليس محتوى الأساليب.

ملكنا مجموعة أدوات إعادة هندسة برامج DMS سيوفر نفس المعلومات التجريدية مثل GCC-XML ، ولكن يتضمن بالإضافة إلى ذلك التفاصيل الكاملة لمحتوى التعريفات (على سبيل المثال ، معلومات الجسم) ، بدعم من ذلك C ++ الواجهة الأمامية. سيتيح لك هذا الوصول إلى delcarations و محتوى للتحقق من برامج الطالب الخاصة بك.

يوفر DMS تحليلًا عامًا للأغراض العامة إلى ASTS ، وجداول الرموز ومطابقة النمط المصدر. يوفر الواجهة الأمامية C ++ تحليل C ++ الكامل ، وبناء C ++ ASTS ومعلومات الرمز المقابلة. ما تفعله بعد ذلك من أجل الاعتراف متروك لك ، ولكن يبدو أن مثالك يدور حول البحث عن نمط معين.

سيتم التعامل مع نصف مثالك بواسطة أنماط مصدر قليلة لـ C ++:

pattern is_correct_student_class(m:members):class =
  " class user { \m } ".

pattern is_correct_student_method_present(p:parameters,s:statements):method =
  " const  get_name(\p) { \s } "

(سامح بناء جملة C ++ الخاص بي ، أنا لا أكتب الكثير منه) والتي ستتطابق مع أي AST ، على التوالي ، تقابل فئة المستخدم المسماة وطريقة const المطلوبة. الاقتباسات هي Quotes ، مع وجود الأشياء الموجودة داخل بناء جملة C ++ مع هروب p و m و s تمثل metavariables p و m و s ، والتي يجب أن تكون قائمة معلمات ، قائمة طريقة و structs على التوالي في من أجل مطابقة النمط. يتم اشتقاق تعريفات قائمة المعلمات ، وما إلى ذلك تلقائيًا من الجزء النحوي C ++ من الواجهة الأمامية C ++.

يتم تنفيذ النصف الآخر بواسطة جزء من رمز Parlanse DMS الذي تم تنفيذه بعد استدعاء محلل C ++ و Resolver Name/Type:

   (define has_student_code (lamdba (function boolean [tree AST]))
      (AST:IsInTree tree
          (lambda (function boolean [tree1 AST]
              (&& (Registry:MatchPattern tree1 "is_correct_student_class")
                  (AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
                       (lambda (function boolean [tree2 AST]) 
                           (Registry:MatchPattern tree2 ; a member
                                 "is_correct_student_method_present")
                       )lambda
          )lambda
      )
   )define

مع بعض الحريات التي اتخذت لتبسيط العرض التقديمي.

هذا شيك بسيط جدا. يمكنك الوصول إلى جدول الرموز من رمز parlanse للقيام بمزيد من التطور في التحقق مما إذا كان ذلك منطقيًا.

على الرغم من أن DMS لا يعمل مباشرة تحت Linux ، إلا أنه يبدو أنه يعمل تحت النبيذ.

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