2016-05-25 9 views
7

क्या प्रोग्राम में पैटर्न के अनुक्रम की पहचान करने के लिए clang matchers का उपयोग करना संभव है?पैटर्न के अनुक्रम का पता लगाने के लिए क्लैंग मैचर्स का उपयोग

उदाहरण के लिए मुझे ऐसे पैटर्न ढूंढने की आवश्यकता है जिसमें पैटर्न 1 पैटर्न 2 से पहले होता है।

उदाहरण के लिए:

Pattern1 = सूचक पी करने के लिए एक मूल्य बताए
pattern2 = अपसंदर्भन सूचक पी

मैं उन मामलों को pattern1 और pattern2 कोड में होने की पहचान कर सकते, लेकिन यह एक निर्दिष्ट करना संभव है आदेश? (कहें पैटर्न 1 पैटर्न 2 से पहले होना है और केवल उन मामलों से मेल खाता है) धन्यवाद!

उत्तर

1

सही उत्तर

अनुक्रम आकृति के लिए वास्तविकता traversing ASTs (जो स्थिर विश्लेषण का आधार है) में है क्योंकि आप नहीं जानते कि क्या बयान pattern1 वास्तव pattern2

से पहले होने जा रहा है वास्तव में सही दृष्टिकोण है

पर विचार करें

int foo() { 
     int a = 0; 
     int *b; 
     int c = -1; 
     if(c < 0) goto fixit; 
nowhat: 
     b = &a; 
fixit: 
     c = *b; 
     goto nowhat; 
} 

आप एएसटी यहाँ मदद करने के लिए नहीं जा रहा है देख सकते हैं लेकिन CFG उपयोग करने के लिए सही बात है।

एक जवाब, काफी, प्रकृति में श्रेणीबद्ध ASTs

आप एएसटी (v6.0.0) वे कर रहे हैं में Traversal matchers को देखें, तो का उपयोग करने का कुछ हद तक। आप भाई बहनों को देखने के लिए मिलान का विस्तार करना चाहते हैं।

मुझे लगता है कि मैं एक कस्टम एएसटी मैचर को कार्यान्वित करने के बारे में जानता हूं। यदि नहीं, तो मनू सांचेज़ ने Writing AST Matchers for libclang ब्लॉग पोस्ट में इसे अच्छी तरह से समझाया है।

सुनिश्चित नहीं हैं कि अगर वह वास्तव में एक भाई मिलान लेखन में हो जाता है, लेकिन वह बहुत करीब आता है, तो वहाँ शुरू करें और फिर इस के लिए कुछ समान लागू करने के लिए है:

के कोड दिए गए मान लीजिए:

(matcher = recordDecl(hasName("P"), \ 
     hasNextSibling(recordDecl(hasName("R"))))` 

आपगठजोड़ कर सकते हैं:

class P {}; class Q {}; class R {}; 

हम की तरह कुछ करने के लिए सक्षम होना चाहते हैं AstMatchFinder कक्षा मेंऔर matchesParent कक्षा और वर्तमान कर्सर के माता-पिता के बच्चों को पार करते हैं (ये भाई बहन होंगे: पी)। फुटनोट्स को पढ़ें क्योंकि आपको रनवे रिकर्सन से बचने के लिए बाउंडक्रर्स को लागू करना होगा।

संबंधित मुद्दे