2016-12-27 11 views
1

Clang libTooling 개발을 처음 접했습니다.clang ast 단일 라인 다중 변수 선언 방문객

내가 "I", "J"와 "K"를 포함하여 전체 선언 식을 캡처하려면, 내 프로젝트의 요구 사항은 다음 변수 선언

int i, j, k = 10; 
^   ^ 

을 고려하십시오.

clang libTooling을 사용하여 모든 변수를 포함하여 완전한 선언 식을 캡처하는 방법은 무엇입니까?

내가 겪고있는 것은 개별 변수 선언을 위해 방문자를 얻는 대신 완전한 표현을 위해 방문자를 얻지 못한다는 것입니다.

clang libTooling에서 예상되는 동작입니까, 아니면 누락 되었습니까?

한 줄로 된 여러 선언이나 해결 방법을 캡처하는 올바른 방법을 제안 하시겠습니까? 모든 종류의 도움을 받으실 수 있습니다.

덕분에, 인 Hemant

+0

단일 배터리에 대한 선언의 전체 배터리를 캡처 할 수있는 방법이 있는지 확실하지 않습니다 line에서 libclang API를 사용할 수 있지만, 아마도 이것들을 소스 코드 위치와 비교하여 같은 라인에서 어떤 변수가 선언 될 때이를 인식 할 수 있습니다. – Argenet

+0

내가 확실히 할 수는 있지만 그 뒤에있는 목적은 자바와 C#을 따르는 파싱 순서를 따르는 것입니다. 내장 된 방법이 없으므로 수동으로 VarDecl을 피하려고합니다. – Hemant

답변

2

는 예를 들어 DeclStmt 노드 (뿐만 아니라 VarDecl) 방문하는 재귀 AST 방문자를 작성할 수 설명 된 문제를 해결합니다. 이러한 방문자를 작성하는 방법을 보려면이 사이트를 확인 : http://clang.llvm.org/docs/RAVFrontendAction.html 당신이 DeclStmt 노드뿐만 아니라 VarDecl 노드를 방문해야하는 이유는 당신의 선언문의 AST 표현을 살펴함으로써 설명 될 수

:

|-DeclStmt 0x35dbfc8 <line:3:1, col:17> 
    | |-VarDecl 0x35dbe48 <col:1, col:5> col:5 i 'int' 
    | |-VarDecl 0x35dbeb8 <col:1, col:8> col:8 j 'int' 
    | `-VarDecl 0x35dbf28 <col:1, col:15> col:11 k 'int' cinit 
    | `-IntegerLiteral 0x35dbf88 <col:15> 'int' 10 

보시다시피 DeclStmt은 모든 VarDecl 개의 노드를 "캡처합니다"(그리고 주어진 경우 초기화). 방문객이 DeclStmt을 방문하면 선언문이 단일 선언을 나타내는 지 여부를 isSingleDecl() 멤버 함수로 확인할 수 있습니다. (다른 경우) , decl_end() 등의 다른 노드로 이테레이터를 검색 할 수 있습니다.

+0

이것은 지역 변수에만 적용됩니다. 전역 변수와 클래스 멤버의 경우 AST는 일반적인 DeclStmt를 표시하지 않습니다. – Hemant