2016-04-23 89 views
2

經過一番研究和幾個問題之後,我最終探索了libclang庫以解析Python中的C++源文件。在Python中使用libclang解析C++

給定C++源

int fac(int n) { 
    return (n>1) ? n∗fac(n−1) : 1; 
} 

for (int i = 0; i < linecount; i++) { 
    sum += array[i]; 
} 

double mean = sum/linecount; 

我試圖識別令牌fac作爲函數名,n作爲變量名,i作爲變量名,mean作爲變量名,與各者沿位置。我最終對感興趣,他們將它們標記爲

我看過一些非常有用的文章(eli'sGaetan's)以及一些堆棧溢出問題3511319713236500

但是,由於我是Python新手,並且很難理解libclang的基礎知識,所以我非常感謝一些代碼塊,這些代碼塊實現了上述內容供我從中學習和理解。

+0

你不記號化的語言元素如果你有Clang或其他工具,解析器具有內置的能力。存在如何得到結果的問題。您可以在http://stackoverflow.com/a/36681568/120163上看到C詞法分析器的輸出。問題是,Clang提供了什麼API來提供對這些令牌的訪問? –

+0

如果libclang提供了一個更好的標記化工具。然而,我一直在努力,首先得到與你所提到的類似的輸出,其次,使用那個輸出來處理我描述的例子中所述的需求。任何指導方針? –

+0

我的觀點更多的是關於誰在做標記。如果*你*會這樣做,目前還不清楚鏗鏘會如何幫助或爲什麼你想要它。 (如果你所有的都是令牌,不管你如何得到它們,個人都會懷疑你是否會用C++代碼做很多有趣的事情)。我對Clang APIs知之甚少。也許這個答案會幫助你:http://stackoverflow.com/a/25371656/120163 –

回答

4

從libclang API中不會立即明白提取令牌的合適方法是什麼。然而,你很少需要(或者想要)降低到這個水平 - 遊標層通常更有用。

但是,如果這是你需要的東西 - 一個小例子可能看起來像:

import clang.cindex 

s = ''' 
int fac(int n) { 
    return (n>1) ? n*fac(n-1) : 1; 
} 
''' 

idx = clang.cindex.Index.create() 
tu = idx.parse('tmp.cpp', args=['-std=c++11'], 
       unsaved_files=[('tmp.cpp', s)], options=0) 
for t in tu.get_tokens(extent=tu.cursor.extent): 
    print t.kind 

這(對我的版本鐺的)產生

TokenKind.KEYWORD 
TokenKind.IDENTIFIER 
TokenKind.PUNCTUATION 
TokenKind.KEYWORD 
TokenKind.IDENTIFIER 
TokenKind.PUNCTUATION 
TokenKind.PUNCTUATION 
TokenKind.KEYWORD 
TokenKind.PUNCTUATION 
TokenKind.IDENTIFIER 
TokenKind.PUNCTUATION 
TokenKind.LITERAL 
TokenKind.PUNCTUATION 
TokenKind.PUNCTUATION 
TokenKind.IDENTIFIER 
TokenKind.PUNCTUATION 
TokenKind.IDENTIFIER 
TokenKind.PUNCTUATION 
TokenKind.IDENTIFIER 
TokenKind.PUNCTUATION 
TokenKind.LITERAL 
TokenKind.PUNCTUATION 
TokenKind.PUNCTUATION 
TokenKind.LITERAL 
TokenKind.PUNCTUATION 
TokenKind.PUNCTUATION 
+0

看起來不錯!然而,可以看到[這裏](http://stackoverflow.com/questions/36821176/libclang-error-specified-module-could-not-be-found)我努力使libclang運行。任何想法來克服錯誤,所以我可以測試你的答案,請? –

+0

您能否提供一個我可以在哪裏閱讀關於libclang方法(如'parse()','get_tokens()'等的鏈接?很難找到參考資料來源和/或文檔。 –