나는 코드 검토 봇을 구성하기 위해 clang (Python 바인딩을 통해 libclang을 통해)을 사용하고 있습니다. 나는 모든 FOR_STMT 커서가 4 명의 자식을 가질 것이라는 가정을하고 있습니다. INIT, EVAL, INC, 그리고 BODY .. 내가 좋아하는 파이썬에서 뭔가 평가 식의 내용을 확인 할 수 있음을 의미하는 것이다 libclang을 사용하여 for 루프에서 조건부 평가를 찾으십시오.
for(INIT; EVAL; INC)
BODY;
:이 방법을 보인다
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 바인딩은 특히 드문 드문 있습니다. 그러나 나는 최근에 다음과 같은 루프가 있음을 발견했습니다.
에만 3 명의 자녀가 있으며 평가는 이제 두 번째가 아닌 첫 번째 것입니다. 나는 항상 libclang이 FOR_STMT의 사용하지 않는 부분에 대해 NULL_STMT를 리턴한다고 가정했다. 분명히 틀렸다.
FOR_STMT를 구문 분석하기위한 적절한 방법은 무엇입니까? 나는 libclang에서 이것에 대해 유용한 것을 찾을 수 없다.
업데이트 : libclang 소스를 살펴보면 방문자 개체를 사용하여 clang :: ForStmt 클래스에서 4 가지 구성 요소가 더 이상 추가되지 않는 것처럼 보입니다. ForStmt 객체는 null 문 객체를 반환해야하지만, 어딘가에있는 일부 레이어는 방문한 노드 벡터에서이 객체를 스트립하는 것으로 보인다 ...?