我正在使用clang(通过Python绑定通过libclang)组建一个代码审查机器人。我一直假设所有FOR_STMT游标都有4个孩子; INIT,EVAL,INC和BODY ..
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中找不到任何有用的东西。
UPDATE:通过libclang源,看起来这些4个组件是使用访问者对象从clang :: ForStmt类中愚蠢地添加的。 ForStmt对象应该返回null语句对象,但是某个层似乎正在从访问节点向量中剥离这些...?
答案 0 :(得分:0)
在这里,作为一种解决方法,我用虚拟的int foo = 0语句替换了第一个空语句。 我可以想象一个解决方案,它使用Cursor的get_tokens来匹配语句的各个部分。 函数get_tokens可以在clang不够的情况下提供帮助。