2009-03-05 8 views
18

Tôi đang cố gắng làm việc trên một loại trình tạo mã để giúp thử nghiệm đơn vị một dự án pha trộn C/C++ kế thừa. Tôi không tìm thấy bất kỳ loại công cụ độc lập nào có thể tạo ra mã khai từ việc khai báo. Vì vậy, tôi quyết định để xây dựng một, nó không phải là khó khăn.Tôi có thể tìm ngữ pháp BNF hoặc YACC chuẩn cho ngôn ngữ C++ ở đâu?

Xin vui lòng, bất kỳ ai cũng có thể chỉ cho tôi một liên kết ngữ pháp chuẩn, được mô tả tốt hơn bằng ngôn ngữ yacc.

Hy vọng tôi không sáng tạo lại bánh xe, hãy giúp tôi trong trường hợp đó.

Best Regards, Kevin

+0

Để tạo mã sơ khai từ một khai báo, trước tiên bạn phải phân tích cú pháp khai báo. Điều đó trong thực tế có nghĩa là một trình phân tích cú pháp C++ đầy đủ. Bạn thực sự không muốn làm điều này. –

Trả lời

2

Để có cách tiếp cận khác, bạn có thể xem xét sự ủng hộ của heo trên trình biên dịch hiện có.

GCC-XML sẽ "biên dịch" C++ thành tệp XML với nhiều thông tin hữu ích; nó có thể là đủ cho mục đích của bạn.

Thật không may, GCC-XML chỉ là 1/4-duy trì, và làm cho nó hoạt động có thể ... thú vị. Chúc may mắn, nếu bạn đi tuyến đường này.

20

Từ C++ FAQ Lite:

38.11 Is there a yacc-able C++ grammar?

Ngữ pháp yacc chính bạn sẽ muốn là từ Ed Willink. Ed tin rằng ngữ pháp của bạn hoàn toàn tuân thủ với the ISO/ANSI C++ standard, tuy nhiên, ông không đảm bảo rằng: "ngữ pháp có không", ông nói, "được sử dụng trong sự tức giận." Bạn có thể nhận được the grammar without action routines hoặc the grammar with dummy action routines. Bạn cũng có thể nhận được the corresponding lexer. Đối với những người là quan tâm đến cách ông đạt được trình phân tích cú pháp không có ngữ cảnh (bằng cách đẩy tất cả sự mơ hồ cộng với số lượng nhỏ sửa chữa sau khi phân tích hoàn tất), bạn có thể muốn đọc chương 4 của his thesis.

Ngoài ra còn có ngữ pháp yacc rất cũ không hỗ trợ mẫu, ngoại lệ, cũng như không gian tên; cộng với nó lệch từ ngôn ngữ chính trong một số cách tinh tế. Bạn có thể nhận được rằng ngữ pháp here hoặc here.

+2

Nếu bạn cần thực sự phân tích cú pháp C++, bạn cần máy móc thực sự hoạt động. "Không được sử dụng trong tức giận" có nghĩa là nó không hoạt động cho mã C++ thực. (Tôi không hiểu tại sao câu trả lời này lại được ưa thích/được bỏ phiếu nhiều lần vì làm thế nào hoàn toàn không hiệu quả câu trả lời này sẽ là). –

+1

@Ira: Tôi đoán là tại sao nó được upvoted là có thực sự không phải là bất cứ điều gì tốt hơn. Phân tích cú pháp C++ rất khó. –

+1

Ira đúng. Bạn có thể sẽ chỉ lãng phí thời gian của bạn. Tôi là tất cả để xây dựng của riêng bạn, và rơi xuống hố thỏ, nếu những gì bạn muốn làm là tìm hiểu. Nhưng nếu bạn muốn hoàn thành công việc, bạn nên lấy thứ gì đó hoạt động ra khỏi hộp. Các công cụ DMS có những ưu điểm khác ở chỗ nó bao gồm một loạt các ngôn ngữ và có các tính năng bổ sung mà bạn có thể thấy hữu ích trong dự án của mình. Nếu thời gian của bạn có giá trị tiền bạc (nghĩa là bạn không làm điều đó cho vui) thì giá cả hợp lý. –

1

Tôi đã tìm thấy this one gần đây. Tôi đã không thử nó ra, do đó, không chắc chắn nếu nó hoạt động. Bạn có thể cung cấp thêm thông tin về công cụ bạn đang cố gắng phát triển không? Tôi đã tải ngữ pháp này xuống vì tôi đang làm việc trên một công cụ thiết bị để tôi có thể thêm thông tin bảo hiểm cho số unit test framework của mình.

Sau khi đọc bình luận của bạn ...

Tôi nghĩ this tool chính xác phù hợp với nhu cầu của bạn.

+0

Tôi thực sự đang làm việc trên một cái gì đó thực sự thuộc về một khung kiểm thử đơn vị. Để thử nghiệm một đơn vị dịch thuật, tham chiếu bên ngoài cần phải được cung cấp để tạo ra một nhị phân có thể chạy được, vì vậy tôi đang cố gắng phân tích mã nguồn để tìm các khai báo và tạo ra định nghĩa sơ khai. –

2

Liên kết của Jared là điều gần nhất với ngữ pháp không có ngữ cảnh mà bạn có thể nhận được. Một số điều cần phải được trì hoãn cho sau này, nhưng đó là bởi một số đối số tốt hơn ngữ pháp ngữ cảnh nhạy cảm của C++.

Để làm mọi thứ trở nên tồi tệ hơn, C++ 1x sẽ phức tạp hóa ngữ pháp một cách đáng kể. Để có được phân tích cú pháp hoàn hảo của C++, một trình phân tích cú pháp sẽ cần phải thực hiện đủ tiêu chuẩn để thực hiện phân giải quá tải một cách chính xác, bao gồm việc trích lập đối số mẫu, do đó sẽ yêu cầu cơ chế khái niệm, lambdas và có hiệu lực gần như tất cả ngôn ngữ, ngoại trừ tra cứu tên hai giai đoạn và các đặc điểm ngoại lệ, nếu tôi gọi lại chính xác, không cần triển khai thực tế để phân tích thành công chương trình.

Thực tế, bạn đang nửa chừng đến trình biên dịch nếu bạn có thể phân tích cú pháp C++.

+0

Nếu bạn không thể thực hiện phân giải tên hoàn toàn, bạn không ở đâu gần trình biên dịch C++. Phân tích cú pháp dễ dàng hơn nhiều so với độ phân giải tên. –

+1

Không, vì phân tích cú pháp yêu cầu độ phân giải tên; đó là quan điểm của tôi. Ngữ pháp của C++ là xấu. – coppro

+0

Phân tích cú pháp C++ KHÔNG yêu cầu độ phân giải tên nếu bạn sử dụng trình phân tích cú pháp GLR.Trong thực tế, nó là khá dễ dàng và chúng tôi làm điều đó với công cụ DMS của chúng tôi mỗi ngày (www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html). Nếu bạn nhấn mạnh vào việc sử dụng một trình phân tích cú pháp LALR (1) mà không thể chịu đựng được sự mơ hồ của địa phương, thì * bạn phải đặt tên giải quyết khi phân tích cú pháp và tôi đồng ý đó là một mớ hỗn độn, nhưng sau đó có lý do bạn không làm theo cách đó. Làm cho độ phân giải tên cho C + + ngay cả với sự mơ hồ địa phương vẫn còn khá khó khăn, tôi sẽ cấp, nhưng không gần như là khó chịu như khi rối với phân tích cú pháp. –

1

Bộ công cụ tái cấu trúc phần mềm DMS của chúng tôi có thể thu được bằng trình phân tích cú pháp C++ đầy đủ tính năng mạnh mẽ, . Xem http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html Việc này sẽ xây dựng các bảng AST và biểu tượng và có thể phỏng đoán loại biểu thức bất kỳ. DMS cho phép thực hiện phân tích và chuyển đổi tùy ý trên mã C++.

Một phép chuyển đổi "đơn giản" là thiết lập mã để thu thập phạm vi kiểm tra dữ liệu; chúng tôi cung cấp công cụ này như một công cụ COTS. Xem bài viết này để hiểu làm thế nào DMS làm nó: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

EDIT tháng 9 năm 2013 (Câu trả lời này đã nhận được một chút cũ): Phân tích dòng C++ phân tích cú pháp/độ phân giải tên/Kiểm soát DMS của xử lý đầy đủ C++ 11, trong Các biến thể ISO-, GNU và Microsoft. Nó cũng sẽ phân tích cú pháp (và giữ lại) mã nguồn có chứa hầu hết các điều kiện tiền xử lý. Nó có ngữ pháp rõ ràng thúc đẩy quá trình phân tích cú pháp, không giống như GCC hoặc Clang.

+0

Trong khi stackoverflow không trực tiếp ưu tiên hoặc không thích các giải pháp nguồn mở và/hoặc miễn phí, nói chung là một ý tưởng tồi khi đặt một liên kết phức tạp không trực tiếp trỏ đến một giải pháp. Nếu bạn thực sự muốn quảng cáo công cụ của mình, ít nhất là trỏ đến một trang có mã ví dụ và phụ thuộc mà người dùng có thể sử dụng mà không cần phải đọc các liên kết tải xuống của công ty và các liên kết tải xuống có tường bao quanh. –

+0

OP cho biết ông muốn một ngữ pháp, nhưng vấn đề thực sự của ông là phân tích cú pháp C++ để trích xuất thông tin để tạo ra sơ khai. Câu trả lời của tôi cho thấy cách giải quyết vấn đề thực tế của mình bằng cách bỏ qua ý tưởng không thực tế của mình về việc nhận được một ngữ pháp làm việc (chúng không tồn tại đối với các trình tạo phân tích cú pháp thông thường) và sau đó phân tích cú pháp bằng cách nào đó mà không giải quyết vấn đề về độ phân giải tên công việc). "Liên kết phức tạp" này trỏ trực tiếp đến câu trả lời thực tế. –

+0

Không cần phải đặt ra ý kiến ​​nếu bạn cho rằng một câu hỏi là không thực tế. Hãy để người khác đủ điều kiện cho câu hỏi trả lời câu hỏi hoặc để câu hỏi không được trả lời và được chứng minh đúng. Thứ hai, tôi đã truy cập vào trang đó và không thể nhìn thấy bất kỳ câu trả lời nào nhưng một số vấn đề tiếp thị về giao diện người dùng không có bất kỳ ví dụ nào cũng như liên kết tải xuống. Nếu có câu trả lời thực tế, vui lòng chỉnh sửa câu trả lời và thêm câu trả lời vào đây trong trường hợp trang web bị hỏng. –

4

Tôi vừa mới tìm thấy một số file ngữ pháp cho C++ (C++ 1998: ISO/IEC 14882: 1998 và C++ 2008: ISO/IEC SC22/WG21 N2723 = 08-0233) tại grammarware website. Các ngữ pháp được thể hiện bằng BNF, DMS BNF, BGF, SDF và Rascal ký hiệu. Thật đáng tiếc, mặc dù, các ngữ pháp C++ dường như không được cập nhật (không có C++ 2003 hoặc C++ 11).