2013-10-16 15 views
6

Tôi đang sử dụng ràng buộc python của libclang nhưng tôi nghĩ rằng vấn đề này là do libclang không phải do ràng buộc python.clang không thể phân tích cú pháp tệp .h độc lập của tôi

Tôi có một tiêu đề object.h

#ifndef OBJECT_H 
#define OBJECT_H 

class Object { 
public: 
    int run(); 
}; 

#endif 

Và một thực hiện object.cpp

#include "object.h" 

int Object::run() { 
    int a = 0; 
    return a*a; 
} 

Nếu tôi ghé thăm AST của đơn vị dịch object.h, nút AST cuối cùng là VAR_DECLclass Object và đó là nó. Nó sẽ không truy cập vào phần public:.... Nếu tôi sử dụng clang để kiểm tra cú pháp trực tiếp là sẽ khiếu nại về tập tin tiêu đề của tôi là sai.

$ clang -Xclang -ast-dump -fsyntax-only object/object.h 
object/object.h:4:1: error: unknown type name 'class' 
class Object { 
^ 
object/object.h:4:13: error: expected ';' after top level declarator 
class Object { 
      ^
      ; 
TranslationUnitDecl 0x7f816102d2d0 <<invalid sloc>> 
|-TypedefDecl 0x7f816102d7d0 <<invalid sloc>> __int128_t '__int128' 
|-TypedefDecl 0x7f816102d830 <<invalid sloc>> __uint128_t 'unsigned __int128' 
|-TypedefDecl 0x7f816102db80 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]' 
`-VarDecl 0x7f816102dbf0 <object/object.h:4:1, col:7> Object 'int' invalid 
2 errors generated. 

Nếu tôi sử dụng tiếng kêu để thoát ast của object.cpp, tôi sẽ không gặp lỗi đó.

$ clang -Xclang -ast-dump -fsyntax-only object/object.cpp 
TranslationUnitDecl 0x7fc6230302d0 <<invalid sloc>> 
|-TypedefDecl 0x7fc623030810 <<invalid sloc>> __int128_t '__int128' 
|-TypedefDecl 0x7fc623030870 <<invalid sloc>> __uint128_t 'unsigned __int128' 
|-TypedefDecl 0x7fc623030c30 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]' 
|-CXXRecordDecl 0x7fc623030c80 <object/object.h:4:1, line:7:1> class Object definition 
| |-CXXRecordDecl 0x7fc623030d90 <line:4:1, col:7> class Object 
| |-AccessSpecDecl 0x7fc623030e20 <line:5:1, col:7> public 
| `-CXXMethodDecl 0x7fc623030ea0 <line:6:3, col:11> run 'int (void)' 
`-CXXMethodDecl 0x7fc62307be10 parent 0x7fc623030c80 prev 0x7fc623030ea0 <object/object.cpp:3:1, line:6:1> run 'int (void)' 
    `-CompoundStmt 0x7fc62307c058 <line:3:19, line:6:1> 
    |-DeclStmt 0x7fc62307bf78 <line:4:3, col:12> 
    | `-VarDecl 0x7fc62307bf00 <col:3, col:11> a 'int' 
    | `-IntegerLiteral 0x7fc62307bf58 <col:11> 'int' 0 
    `-ReturnStmt 0x7fc62307c038 <line:5:3, col:12> 
     `-BinaryOperator 0x7fc62307c010 <col:10, col:12> 'int' '*' 
     |-ImplicitCastExpr 0x7fc62307bfe0 <col:10> 'int' <LValueToRValue> 
     | `-DeclRefExpr 0x7fc62307bf90 <col:10> 'int' lvalue Var 0x7fc62307bf00 'a' 'int' 
     `-ImplicitCastExpr 0x7fc62307bff8 <col:12> 'int' <LValueToRValue> 
      `-DeclRefExpr 0x7fc62307bfb8 <col:12> 'int' lvalue Var 0x7fc62307bf00 'a' 'int' 

Dường như clang kết hợp object.hobject.cpp với nhau rồi thực hiện phân tích cú pháp. Nếu vậy, làm cách nào để nhận nút ast của Object trong dòng thrid của object.cppint Object::run() {? Có một nút ast cho điều đó không?

Nó cũng gây nhầm lẫn cho tôi rất nhiều khi tôi truy cập phương thức run() trong object.cpp, vị trí hiện tại là ở object.cpp nhưng mức độ là object.h. Mức độ chính xác có nghĩa là gì? Bất kỳ tài liệu hướng dẫn nào dễ dàng hơn so với tài liệu API libclang?

Trả lời

8

Clang không biết rằng bạn có mã C++ trong tệp .h của mình. Theo mặc định, nó xử lý tệp .h dưới dạng C. Khi bạn chạy clang trên tệp .cpp, nó biết rằng nó phân tích cú pháp C++.

Có hai cách để khắc phục sự cố này.

  1. biết chính xác những gì kêu vang ngôn ngữ là trong tập tin bằng cách sử dụng -x cờ:

    clang -x c++ -Xclang -ast-dump -fsyntax-only object/object.h 
    
  2. Đổi tên tập tin của bạn để sử dụng một .hh hoặc .hpp hậu tố. Các hậu tố này cho phép clang giả định tệp chứa mã C++.

    Nếu bạn đổi tên tệp tiêu đề, bạn cần thay đổi câu lệnh #include để khớp.

+0

các công cụ bổ sung khác như thế nào? Ví dụ: clang-query, nó không có tùy chọn để thiết lập cờ C++ – thisEric

Các vấn đề liên quan