2014-11-05 28 views
1

我正在使用clang(通過Python綁定通過libclang)將代碼審查機器人放在一起。我一直在假設所有FOR_STMT遊標將有4個孩子; INIT,EVAL,INC,和身體..在for循環中使用libclang查找條件評估

for(INIT; EVAL; INC) 
    BODY; 

這將意味着我可以像Python的東西檢查評估表達的內容:

forLoopComponents = [ c for c in forCursor.get_children() ] 
assert(len(forLoopComponents) == 4) 

initExpressionCursor = forLoopComponents[ 0 ] 
evalExpressionCursor = forLoopComponents[ 1 ] 
incExpressionCursor = forLoopComponents[ 2 ] 
bodyExpressionCursor = forLoopComponents[ 3 ] 

errorIfContainsAssignment(evalExpressionCursor) # example code style rule 

這種做法似乎不太...比開始的時候好,但我只是接受它作爲libclang的結果,尤其是Python綁定,而且相當稀疏。不過我最近注意到,像一個循環:

for(; a < 4; a--) 
    ; 

只會有3個孩子 - 和評估現在是第一個而不是第二。我一直認爲libclang會爲FOR_STMT的任何未使用的部分返回NULL_STMT ......顯然,我錯了。

什麼是解析FOR_STMT的正確方法?我在libclang中找不到有用的東西。

更新:通過libclang源代碼,它看起來像使用訪客對象從clang :: ForStmt類中無意添加這4個組件。 ForStmt對象應該返回空語句對象,但某處某處的圖層似乎將這些從訪問節點向量中剝離出來......?

回答

0

同樣在這裏,作爲解決方法,我用虛擬int foo = 0語句替換了第一個空語句。 我可以想象一個解決方案,它使用Cursor的get_tokens來匹配語句的各個部分。 函數get_tokens可以在clang不夠的情況下提供幫助。