सही उत्तर
अनुक्रम आकृति के लिए वास्तविकता 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
कक्षा और वर्तमान कर्सर के माता-पिता के बच्चों को पार करते हैं (ये भाई बहन होंगे: पी)। फुटनोट्स को पढ़ें क्योंकि आपको रनवे रिकर्सन से बचने के लिए बाउंडक्रर्स को लागू करना होगा।
स्रोत
2017-09-27 04:31:48