2009-10-25 21 views
6

Tôi muốn một tập lệnh python in danh sách tất cả các hàm được định nghĩa trong tệp C/C++.Kịch bản Python để in tất cả các định nghĩa hàm của một tệp C/C++

ví dụ: abc.c định nghĩa hai chức năng như:

void func1() { } 
int func2(int i) { printf("%d", i); return 1; } 

Tôi chỉ muốn tìm kiếm các tập tin (abc.c) và in tất cả các chức năng được xác định trong đó (chỉ tên hàm). Trong ví dụ trên, tôi muốn in func1, func2 bằng cách sử dụng tập lệnh python.

+1

Bạn có biết cách xác định hàm và hỏi cách triển khai hay bạn đang hỏi cách xác định hàm c? – foosion

Trả lời

2

antlr là công cụ của bạn

3

Tôi khuyên bạn nên sử dụng công cụ PLY lex/yacc. Có một trình phân tích cú pháp C dựng sẵn và trình phân tích cú pháp chính nó là khá nhanh. Khi bạn đã phân tích cú pháp tệp, không quá khó để tìm tất cả các hàm.

http://www.dabeaz.com/ply/

1

Để làm điều này đáng tin cậy, bạn sẽ cần phải phân tích C hoặc C++, và sau đó lấy các định nghĩa chức năng từ AST phân tích cú pháp sản xuất.

C khá dễ dàng để phân tích cú pháp. Như pavpanchekha đề cập, các PLY phân tích cú pháp đi kèm với một phân tích cú pháp C, và đã được sử dụng để thực hiện các dự án có liên quan sau đây:

Parsing C++ code đang phức tạp hơn .. "Is there a good Python library that can parse C++" nên được giúp đỡ:

C++ rất khó phân tích cú pháp. Hầu hết những người cố gắng làm điều này đúng cách kết thúc việc tách rời một trình biên dịch. Trong thực tế, đây là (một phần) tại sao LLVM bắt đầu: Apple cần một cách họ có thể phân tích cú pháp C++ để sử dụng trong XCode phù hợp với cách trình biên dịch phân tích nó.

Đó là lý do tại sao có các dự án như GCC_XML mà bạn có thể kết hợp với thư viện python xml.

Cuối cùng, nếu mã của bạn không cần phải mạnh mẽ ở tất cả, bạn có thể chạy mã mặc dù một mã reformatter, như indent (cho mã C) để thậm chí những điều trên, sau đó sử dụng biểu thức thông thường để phù hợp với định nghĩa hàm. Có, đây là ý tưởng tồi, dễ bị tấn công, có khả năng xảy ra lỗi và có thể bạn sẽ tìm thấy các định nghĩa chức năng trong các nhận xét nhiều dòng và như vậy, nhưng nó có thể hoạt động tốt ..

1

Trang này, Parsing C++, đề cập đến một vài ngữ pháp ANTLR cho C++. Kể từ ANTLR has a Python API điều này có vẻ giống như một cách hợp lý để tiến hành.

Mặc dù phân tích cú pháp có vẻ phức tạp hơn nhiều so với cụm từ thông dụng, đây là trường hợp người khác đã thực hiện gần như tất cả công việc cho bạn và bạn chỉ cần giao tiếp với nó từ Python.

Một giải pháp thay thế, nơi người khác đã thực hiện công việc phân tích cú pháp C++ cho bạn, là pygccxml thúc đẩy GCCXML, phần mở rộng đầu ra cho GCC để tạo XML từ trình biên dịch bên trong của trình biên dịch. Vì Python có hỗ trợ XML tuyệt vời, bạn chỉ cần trích xuất thông tin bạn quan tâm.

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