2011-03-15 4 views
21

저는 cmake 및 Visual Studio 10을 사용하여 Windows 용 clang을 성공적으로 컴파일했습니다. XML 파일을 소스 코드의 AST 표현으로 가져오고 싶습니다.컴파일러를 사용하지 않고 clang으로 C/C++ 코드의 XML AST 덤프를 가져올 수 있습니까?

clang -cc1 -ast-print-xml source.c 

그러나,이 컴파일 단계 (I 피하고자하는)를 호출한다 : 리눅스에서 GCC (우분투)와 함께 그 소리와 함께 결과를 제공하지만, 윈도우 상자에서 작동하지 않습니다 하나 개의 옵션이 있습니다 . 소스 코드를 파헤 치면 나에게 익숙하지 않은만큼 도움이되지 않습니다. 내가 사용하여 AST의 바이너리 버전을 생성하기 위해 관리 할 수 ​​:

clang -emit-ast source.c 

불행하게도,이 형식은 구문 분석에 대한 직접 사용할 수 없습니다. clang에서 바이너리 대신 XML 트리를 직접 생성하는 기존의 메소드가 있습니까?

목표는 .NET 환경의 다른 도구에서 XML 표현을 사용하여 이진 AST에 액세스하기 위해 기본 clang lib를 래핑해야합니다. 누군가가 이미 .NET 용 일부 이진 clang AST 파서를 작성한 경우 세 번째 옵션이있을 수 있습니까?

clang 프런트 엔드에 의해 생성 된 AST가 컴파일 단계에서 생성 된 것과 동일하지 않은 경우가 있습니다.

+2

우리 회사는 C++ 프론트 엔드를 빌드하고 AST의 완전한 XML 덤프를 방출 할 수 있습니다. 사람들이 요청하기 때문에이 확인란을 체크 박스 항목으로 사용합니다. 실제 C++ 프로그램 (모든 헤더 파일 포함)의 출력 양은 간단하고 * 거대한 *이므로 처리 속도가 느리고 서투르게됩니다. 진짜 질문은, 왜 이것을하고 싶습니까?Clang은 이미 C++ AST를 직접 처리 할 수있는 방대한 도구를 제공 할 것입니다 (해당 도구와 동일). 왜 그 모든 작품을 복제하려고 할 것입니까? 왜 당신의 목적을 위해 Clang을 사용하지 않는가? –

+0

... http://stackoverflow.com/a/17393852/120163에서 C++ 트리 덤프를 참조하십시오. XML이 아니지만 동일한 내용의 XML도 생성 할 수 있습니다. –

답변

20

정보를 얻으려면 XML 프린터가 Douglas Gregor (CLang FrontEnd의 책임자)에 의해 2.9 버전에서 제거되었습니다.

문제는 XML 프린터가 부족하다는 것이 었습니다. AST 노드의 숫자는 프린터에서 구현 된 적이 없었으며 일부 노드의 많은 특성 때문에 소스 코드가 부정확하게 표현되었습니다.

더글러스가 제기 한 또 다른 포인트는 출력이 외부 도구에 의한 소비가 아니라 CLang 자체 (이는 -emit-ast에 관한 것)를 디버깅하지 않는 것이 적합해야한다는 것입니다. 따라서 한 버전에서 다른 버전으로 안정적인 출력이 필요합니다. 특히 CLang 내부의 1 대 1 매핑이 아니어야하며 소스 코드를 표준어 언어로 번역해야합니다.

프린터의 중요한 작업 (자원 봉사자를 필요로하는) ​​내가 연타의 AST에서 XML을 추출하는 내 자신의 버전에 일한지

+3

재미있는 점은'-emit-ast'는 구조체를 표현하는 대신 형식을 예쁜 것처럼 인쇄하기 때문에 절대 쓸모가 없다는 것입니다. xml 프린터를 사용하면 선언에서 유형을 디버그하고 자동으로 확인할 수있었습니다. –

+0

@ SK-logic : xml은 더 이상 선택 사항이 아니기 때문에'-emit-ast' 동작이 향상 될 수 있습니다. –

+0

이 흥미로운 정보를 제공해 주셔서 감사합니다. 오래된 xml 프린터를 살펴보고 자체 용도로 유용하게 사용할 수 있는지 알아 봅니다. 소스 코드를 표현하는 보편적/표준화 된 방법을 사용하는 것은 좋은 일이지만 공통 분모는 기능을 버리고 모든 언어에 대한 특정 사물을 유지한다는 것은 너무 복잡합니다 ... 일부 확장 가능한 접근법은 좋을 것입니다 ... 지금은이 답변에 많은 감사드립니다. – jdehaan

3

가 ... 다시 통합되지 않습니다 존재하지 않는. 내 코드는 AST를 통과하기 위해 libclang의 Python 바인딩을 사용합니다.

내 코드는 https://github.com/BentleyJOakes/PCX

편집에서 발견된다 : 나는 각 AST 노드에 대한 올바른 소스 코드 토큰을 생성의 측면에서 매우 불완전 것을 추가해야합니다. 불행히도 각 AST 노드 유형에 맞게 코딩해야합니다. 그러나이 코드는이를 더 추구하고자하는 사람들을위한 기반을 제공해야합니다.

1

사용자 정의 ASTDumper를 사용하면 모든 소스 파일을 컴파일하지 않고 작업을 수행 할 수 있습니다. (프론트 엔드 부분에서 멈춤). 하지만이를 달성하기 위해서는 llvm의 모든 C 및 C++ 코드 소스를 처리해야합니다.