आप मनमाने ढंग से कोड विश्लेषण करना चाहते हैं तो , आपको मनमाने ढंग से पार्सिंग/मिलान/आदि की आवश्यकता है। जीसीसी-एक्सएमएल आपको घोषणा जानकारी देगा, लेकिन विधियों की सामग्री नहीं।
हमारे DMS Software Reengineering Toolkit जीसीसी-एक्सएमएल के रूप में ही सार जानकारी प्रदान करेगा, लेकिन अतिरिक्त परिभाषाओं की सामग्री (जैसे, विधि शरीर जानकारी) के लिए पूर्ण विस्तार में शामिल हैं, अपने C++ Front End द्वारा समर्थित। यह आपको अपने छात्र कार्यक्रमों की जांच के लिए और सामग्री से डेलरेशन तक पहुंचने देगा।
डीएमएस एएसटी, प्रतीक सारणी और स्रोत-पैटर्न मिलान के लिए सामान्य उद्देश्य पार्सिंग प्रदान करता है। सी ++ फ्रंट एंड पूर्ण सी ++ पार्सिंग प्रदान करता है, सी ++ एएसटी और संबंधित प्रतीक जानकारी का निर्माण करता है। इसके बाद आप मान्यता के लिए क्या करते हैं, लेकिन आपका उदाहरण एक विशिष्ट पैटर्न की तलाश में प्रतीत होता है।
अपने उदाहरण के आधा सी के लिए कुछ डीएमएस स्रोत पैटर्न ++ द्वारा नियंत्रित किया जाएगा:
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 } "
(माफ मेरी सी ++ वाक्य रचना, मैं इसके बारे में एक बहुत कुछ लिख नहीं है) जो किसी भी एएसटी क्रमशः से मेल खाएगा, , नामित उपयोगकर्ता वर्ग और वांछित कॉन्स विधि के अनुरूप। उद्धरण मेटा-कोट्स हैं, सी ++ सिंटैक्स के अंदर सामान \ p, \ m और \ मेटाएरिएबल्स पी, एम, और एस का प्रतिनिधित्व करते हुए सामान के साथ है, जो पैरामीटर सूची, विधि सूची और विवरण के अनुसार वाक्यबद्ध रूप से होना चाहिए पैटर्न से मेल खाने के क्रम में क्रमशः सूचियां। पैरामीटर सूची, आदि की परिभाषा स्वचालित रूप से C++ फ्रंट एंड के C++ व्याकरण भाग से व्युत्पन्न की जाती है। कुछ प्रस्तुति को आसान बनाने के लिए ले जाया स्वतंत्रता के साथ
(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 कोड का एक सा द्वारा कार्यान्वित किया जाता।
यह एक बहुत ही सरल जांच है; यदि आप समझ में आता है तो आप अधिक परिष्कृत जांच करने के लिए PARLANSE कोड से प्रतीक तालिका तक पहुंच सकते हैं।
जबकि डीएमएस सीधे लिनक्स के तहत नहीं चलता है, यह शराब के तहत चल रहा है।
हमम ... अगर कोई त्रुटि नहीं है, तो ** हाँ! **: main.cpp कक्षा और विधि को परिभाषित करता है; अन्यथा त्रुटि कुछ भी हो सकती है – pmg
यह गैर-कॉन्स विधि 'get_name' के साथ ठीक ठीक संकलित करेगा। अन्य संभावित त्रुटियों के संबंध में आपको पीएमजी के बिंदु के बावजूद 'x' एक 'const उपयोगकर्ता' बनाना होगा। –
धन्यवाद मार्क। कोड बदल गया: 'x' अब' const' है। मैंने विधि के लिए 'const' भी पंजीकृत नहीं किया था। बस 'एक्स' कॉन्स गारंटी देता है कि विधि' const' भी है? – pmg