2014-11-05 2 views
1

나는 코드 검토 봇을 구성하기 위해 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 문 객체를 반환해야하지만, 어딘가에있는 일부 레이어는 방문한 노드 벡터에서이 객체를 스트립하는 것으로 보인다 ...?

답변

0

임시 해결 방안으로 첫 번째 빈 문을 더미 int foo = 0 문으로 대체했습니다. Cursor의 get_tokens를 사용하여 문장의 일부와 일치하는 솔루션을 상상해보십시오. 함수 get_tokens는 clang이 충분하지 않은 상황에서 도움이 될 수 있습니다.