我正在使用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对象应该返回空语句对象,但某处某处的图层似乎将这些从访问节点向量中剥离出来......?