2011-01-04 93 views
8

Tôi cần thư viện phân tích cú pháp C++ tốt, ổn định và dễ sử dụng với giao diện C/C++ (C được ưu tiên).
Tôi nghe rằng cint là trình thông dịch tốt C++. Tôi có thể sử dụng nó (hoặc một phần nào đó của nó) cho mục đích này không?
Bất kỳ đề xuất nào?Cần trình phân tích cú pháp C++

+1

Câu hỏi thực sự là, "mục đích của bạn là gì?". Đối với các nhiệm vụ rất đơn giản, cint có thể hữu ích. Đối với bất kỳ phân tích phức tạp nào, bạn sẽ cần tương đương với một đầu cuối trình biên dịch C++ đầy đủ (độ phân giải tên cho C++ là một bitch). Đối với bất kỳ nỗ lực nào để * chuyển đổi * mã, bạn sẽ cần các công cụ có thể làm tròn nguồn gốc, và có rất ít trong số này. –

+0

@Ira: 'cint' * là * một trình soạn thảo C++ đầy đủ ... nó có thể chạy ở chế độ tạo mã gốc cũng như cách diễn giải. Liệu nó có được cấu trúc tốt cho nhu cầu của Artem hay không, tôi không thể nói cho bạn biết. – dmckee

+0

@dmckee: Vì vậy, có vẻ như cint có khả năng có độ phân giải tên/loại đầy đủ, và điều đó có thể đủ cho Artem, và nó có thể không. Ông vẫn cần phải rõ ràng về mục đích của mình trước khi bất cứ ai có thể được rõ ràng về những gì một giải pháp thực sự cho anh ta là. –

Trả lời

10

Xem: http://clang.llvm.org/ Nó có cả giao diện C++ và C (libclang).

+0

Thật không may, không có đồng bằng C truy cập vào AST nào (và không có kế hoạch thực hiện một). –

+0

Tôi nghĩ rằng có thể đi qua AST thông qua libclang. Xem ví dụ . – kbjorklu

+0

Cảm ơn bạn đã trả lời, tôi sẽ kiểm tra tiếng kêu bây giờ. Dường như, nó có thể là giải pháp ... – Artem

1

Tôi không biết về cint, nhưng tôi nghe mọi người sử dụng gcc-xml cho việc này.

Tôi cũng đang tìm kiếm một thư viện độc lập tốt nhưng không tìm thấy bất kỳ thư viện nào.

9

Phân tích cú pháp C++ nổi tiếng là khó. AFAIK chỉ có ba trình phân tích cú pháp được chấp nhận bởi các tiêu chuẩn ngày nay: EDG (được sử dụng rộng rãi như một giao diện người dùng trong các trình biên dịch C++ phổ biến), GCC và Microsoft. Và rõ ràng, Microsoft đã bắt đầu sử dụng trình phân tích cú pháp của EDG trong VS2010, cho Intellisense.

Khi bạn đang xem các tùy chọn miễn phí, bạn bị kẹt khá nhiều tại GCC. Tuy nhiên, nó có thể tạo ra XML, vì vậy phần dễ dàng là ở đó. (Dễ dàng bởi các tiêu chuẩn phân tích cú pháp C++, nghĩa là)

+2

CLang đang làm khá nhiều công việc. Cho dù các chi tiết còn thiếu là quá nhiều để xem xét nó * chấp nhận được * hoặc không được để lại như một bài tập cho người đọc :) –

+2

"Parses Boost" là tiêu chuẩn cá nhân của tôi. Và tôi hiểu rằng Clang vẫn chưa ở đó. – MSalters

+0

@MSalters, Dự án clang tuyên bố có thể biên dịch Boost ngay bây giờ nhưng chỉ có thể biên dịch một phần Qt để họ đến đó, nhưng tôi không nghĩ rằng tôi muốn thử biên dịch mã sản xuất với nó. http://clang.llvm.org/cxx_status.html – Glen

2

Clang là tùy chọn cập nhật và trưởng thành nhất, với API C++ (nhưng không có đồng bằng C). Elsa là một chút lạc hậu và không còn nguyên vẹn, nhưng vẫn là một lựa chọn có thể sử dụng được. Cả hai có thể được sử dụng như các thư viện cũng như các giao diện XML độc lập.

+0

"Clang hiện đang thực hiện tất cả tiêu chuẩn ISO C++ 1998 (bao gồm các lỗi được đề cập trong tiêu chuẩn ISO C++ 2003) ngoại trừ 'xuất' (đã được loại bỏ khỏi bản nháp C++'x) và được coi là trình biên dịch C++ chất lượng sản xuất "Ngày: 2011-07-27 clang.llvm.org/cxx_status.html - Grzegorz Wierzowiecki –

1

Nếu bạn cảm thấy can đảm, các liên kết trong câu trả lời cho "is there a yacc-able C++ grammar?" có thể hữu ích. Gcc-xml và clang đã được đề xuất và Swig also has an XML output tùy thuộc vào những gì bạn đang cố gắng đạt được có thể có liên quan.

+3

" Cảm thấy dũng cảm "sẽ là thuật ngữ sai. Bạn phải cảm thấy Olympian nhận nhiệm vụ giống như một trình phân tích cú pháp C++ đầy đủ. –

1

tôi không thử nó, nhưng tôi nghĩ rằng sự lựa chọn tốt nhất sẽ nhận được các module để phân tích cú pháp từ một số trình biên dịch mã nguồn mở phổ biến như gcc cho C++;

Có lẽ bạn sẽ tìm thấy một cái gì đó thú vị ở đây http://www.nobugs.org/developer/parsingcpp/

2

C++ Front End của chúng tôi là khả năng phân tích một loạt các C tiếng địa phương ++ (ANSI, GCC, MSVS), tự động xây dựng ASTs có các nút được đánh dấu bằng các vị trí nguồn chính xác và được trang trí với bất kỳ văn bản nhận xét gần đó và xây dựng một bảng biểu tượng đầy đủ. (EDIT tháng 1 năm 2013: mặt trước C++ đã có thể xử lý C++ 11 trong một thời gian ngắn).

Mặt trước C++ được xây dựng trên đầu trang của chúng tôi DMS Software Reengineering Toolkit, công nghệ trình biên dịch tổng quát để phân tích và chuyển đổi chương trình, được thiết kế để hỗ trợ xây dựng công cụ tùy chỉnh. Mặt trước của C++ bao gồm một bộ tiền xử lý, trong đó các chỉ thị tiền xử lý có thể được mở rộng hoặc không chung hoặc riêng lẻ cho phù hợp với nhiệm vụ. Nó cũng bao gồm xây dựng biểu tượng đầy đủ với tất cả các công cụ tra cứu Koenig khó chịu.

DMS chấp nhận định nghĩa ngôn ngữ rõ ràng (đó là cách nó hiểu C++; cũng có kết thúc fron cho C, C#, Java, COBOL và nhiều ngôn ngữ khác).DMS cung cấp phân tích cú pháp tổng hợp, xây dựng bảng biểu tượng, máy phân tích lưu lượng, API thủ tục để điều hướng/kiểm tra/sửa đổi cây, chuyển đổi nguồn sang nguồn và tái tạo văn bản AST-to-source bao gồm nhận xét gốc, radices số, v.v. những khả năng này có sẵn để sử dụng bởi Mặt trận C++.

DMS cũng được thiết kế để xử lý quy mô cần thiết cho các tác vụ nghiêm trọng. Thông thường, bạn không chỉ cần một đơn vị biên dịch (đó là những gì GCC sẽ cung cấp cho bạn tốt nhất) nhưng truy cập vào toàn bộ tập hợp. DMS đã được sử dụng để phân tích/biến đổi hàng nghìn đơn vị biên dịch C++ và hàng chục nghìn đơn vị biên dịch C (trên ứng dụng dòng 25 triệu).

"Dễ sử dụng thư viện" là một oxymoron khi nói đến các công cụ thao tác chương trình. Bản thân langauges rất phức tạp (C++ là một trong những khó khăn nhất và trở nên tồi tệ hơn với C++ 0X) và gây ra sự phức tạp về bản chất của các câu hỏi bạn có thể hỏi và câu trả lời (ví dụ: " có thể sửa đổi biến cục bộ X trong phương thức Y trong lớp C trong bất kỳ không gian tên nào N? "). Các câu hỏi của họ rất khó.

Điều bạn muốn là thư viện với sự phức tạp cần thiết cần thiết để cho phép bạn thực hiện nhiệm vụ của mình. DMS đã được phát triển liên tục trong 15 năm qua, để cung cấp sự phức tạp cần thiết. Nếu bạn muốn xử lý chương trình nghiêm túc, tôi cho rằng bạn sẽ cần thông tin đó.

Như bằng chứng, DMS đã được sử dụng để thực hiện tái cấu trúc tự động hóa lớn của phần mềm hệ thống điện tử sứ mệnh dựa trên C++ cho Boeing. Tôi không tin có bất kỳ công cụ nào khác có thể làm được điều này. (Clang có vẻ đang cố gắng, nhưng chỉ dành cho C++. YMMV).

+0

Giá sản phẩm của bạn? – Artem

+0

Đây là sản phẩm dành cho doanh nghiệp; định giá phụ thuộc vào cấu hình và triển khai theo kế hoạch. Liên hệ với nhóm bán hàng. –

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