2012-04-24 34 views
5

Tôi có tệp C-Header xác định một vài phân đoạn, chứa nhiều mảng char.Phân tích cú pháp/đọc các tệp C-Header bằng cách sử dụng Java

Tôi muốn phân tích cú pháp các tệp này bằng Java. Có một thư viện để đọc các tệp C-Header hoặc vào một cấu trúc hoặc có một trình phân tích cú pháp luồng hiểu các tệp C-Header không?

Chỉ để biết thêm nền (Tôi chỉ tìm kiếm trình phân tích cú pháp C-Header, không phải giải pháp cho vấn đề cụ thể này): Tôi có tệp văn bản chứa dữ liệu và tệp C-Header giải thích cấu trúc. Cả hai đều có một chút năng động, vì vậy tôi không muốn tạo các tệp lớp Java.

dụ:

#define TYPE1 
typedef struct type1 
{ 
char name1[10]; 
char name2[5]; 
} 
#endif 

Type2, Type3 vv cũng tương tự.

cấu trúc dữ liệu:

type1ffffffffffaaaaa 
+0

trang hướng dẫn cho lex và yacc (flex và bò rừng) có thể giúp –

+0

Điểm tốt, tôi quên mất yacc. Tôi đã hy vọng sẽ có một giải pháp hiện tại cho việc này. Nhưng tôi đoán tôi có thể tạo trình phân tích cú pháp phát trực tuyến của riêng tôi bằng cách sử dụng yacc. – PhilW

+0

@PhilW, bạn đã tạo trình phân tích cú pháp chưa? Tôi cần phải phân tích C Header chứa các định nghĩa tiền xử lý (chỉ là hằng số nguyên). Tôi cần phải lấy các hằng số này từ ứng dụng C Header tới Java. Tất nhiên tôi đang tìm một số giải pháp đã sẵn sàng trước khi triển khai giải pháp của riêng tôi =) –

Trả lời

12

Bạn có thể sử dụng trình phân tích cú pháp C hiện có cho Java. Nó không nhiều hơn phân tích cú pháp các tập tin tiêu đề, tất nhiên, nhưng điều đó không làm tổn thương bạn.

Chúng tôi sử dụng trình phân tích cú pháp từ dự án Eclipse CDT. Đây là một trình cắm thêm Eclipse, nhưng chúng ta sử dụng thành công nó bên ngoài Eclipse, chúng ta chỉ cần gộp 3 tệp JAR của Eclipse với trình phân tích cú pháp JAR.

Để sử dụng trình phân tích cú pháp CDT, hãy bắt đầu với việc triển khai org.eclipse.cdt.core.model.ILanguage, ví dụ: org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage. Bạn có thể gọi số getTranslationUnit trên đó, chuyển mã và một số công cụ trợ giúp. Một tệp mã được thể hiện bằng một cá thể org.eclipse.cdt.core.parser.FileContent (ít nhất là trong CDT7, điều này dường như thay đổi rất nhiều). Cách dễ nhất để tạo đối tượng như vậy là FileContent.createForExternalFileLocation(filename) hoặc FileContent.create(filename, content). Bằng cách này bạn không cần phải quan tâm đến công cụ Eclipse IFile, mà dường như chỉ hoạt động trong các dự án và không gian làm việc.

Số IASTTranslationUnit bạn lấy lại thể hiện toàn bộ AST của tệp. Tất cả các nút trong đó là các trường hợp của các loại IASTSomething, ví dụ: IASTDeclaration v.v. Bạn có thể triển khai lớp con của riêng mình là org.eclipse.cdt.core.dom.ast.ASTVisitor để lặp qua AST bằng cách sử dụng mẫu khách truy cập. Nếu bạn cần trợ giúp thêm, chỉ cần hỏi.

Tệp JAR chúng tôi sử dụng là org.eclipse.cdt.core.jar, org.eclipse.core.resources.jar, org.eclipse.equinox.common.jarorg.eclipse.osgi.jar.

Sửa: Tôi đã tìm thấy một bài báo trong đó có chứa đoạn mã nguồn cho điều này: "Sử dụng các dụng cụ Eclipse C/C Phát triển ++ như một mạnh mẽ, đầy đủ chức năng, tích cực duy trì ứng dụng nguồn mở C++ Parser", nhưng nó là không còn trực tuyến nữa (chỉ như một phiên bản rút gọn).

+0

Nghe có vẻ phù hợp! Bạn có phiền khi ném vào một vài từ khóa hoặc gợi ý về cách thực hiện điều này không? (Các lớp chính trong kịch bản này là gì?) – PhilW

+0

Thực tế tôi có một câu hỏi: Trong ví dụ trên, tôi có macro "#define type1" - làm cách nào để ASTVisitor truy cập vào đó? – PhilW

+0

Tôi không chắc nó hỗ trợ các câu lệnh tiền xử lý như thế nào, vì mã của chúng tôi không có mã nào trong số chúng. Nhưng có một số phương thức trong 'IASTTranslationUnit' dường như cung cấp cho bạn quyền truy cập vào các câu lệnh tiền xử lý như' # define'. –

4

Ví dụ sử dụng Eclipse CDT chỉ với 2 lọ.
- https://github.com/ricardojlrufino/eclipse-cdt-standalone-astparser
Trong ví dụ này có lớp hiển thị cấu trúc của tệp nguồn dưới dạng cây và ví dụ khác tạo tương tác trên api ...

Chi tiết là với api này (Eclipse CDT Parser), bạn có thể thực hiện phân tích cú pháp từ một chuỗi trong bộ nhớ.

Một ví dụ khác của việc sử dụng là:
https://github.com/ricardojlrufino/cplus-libparser
Thư viện cho khai thác siêu dữ liệu (thông tin về lớp học, phương pháp, các biến) của mã nguồn trong C/C++.

Xem file: https://github.com/ricardojlrufino/cplus-libparser/blob/master/src/main/java/br/com/criativasoft/cpluslibparser/SourceParser.java

3

Như đã đề cập, CDT là hoàn hảo cho nhiệm vụ này. Nhưng không giống như mô tả ở trên, tôi đã sử dụng nó từ bên trong một plugin và có thể sử dụng IFiles. Sau đó, mọi thứ trở nên dễ dàng hơn. Để có được "ITranslationUnit" chỉ làm:

ITranslationUnit tu = (ITranslationUnit) CoreModel.getDefault().create(myIFile); 
IASTTranslationUnit ias = tu.getAST(); 

tôi đã tức là tìm kiếm một #define đặc biệt, vì vậy tôi có thể chỉ:

ppc = ias.getAllPreprocessorStatements(); 

để có được tất cả những điều khoản đang xử lý trước, mỗi câu lệnh trong mảng -thành phần. Hoàn toàn dễ dàng.

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