2014-11-05 92 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不够的情况下提供帮助。