簡體   English   中英

在哪里可以找到 C++ 語言的標准 BNF 或 YACC 語法?

[英]Where can I find standard BNF or YACC grammar for C++ language?

我正在嘗試開發一種代碼生成器來幫助對遺留的 C/C++ 混合項目進行單元測試。 我沒有發現任何一種獨立的工具可以從聲明中生成存根代碼。 所以我決定建一個,應該不會那么難。

拜托,任何人都可以給我一個標准的語法鏈接,用 yacc 語言更好地描述。

希望我不是在重新發明輪子,在這種情況下請幫助我。

最好的問候,凱文

來自C++ FAQ Lite

38.11 有沒有 yacc-able C++ 語法?

您需要的主要 yacc 語法來自 Ed Willink。 Ed 相信他的語法完全符合ISO/ANSI C++ 標准,但他不保證:“語法沒有,”他說,“被用於憤怒。” 您可以獲得沒有動作例程的語法或帶有虛擬動作例程的語法 您還可以獲得相應的 lexer 對於那些對他如何實現無上下文解析器感興趣的人(通過推動所有歧義以及在解析完成后進行少量修復),您可能需要閱讀他論文的第 4 章。

還有一個非常古老的 yacc 語法,它不支持模板、異常和名稱空間; 加上它以一些微妙的方式偏離了核心語言。 您可以在此處此處獲得該語法。

我最近在語法網站上找到了 C++ 的一些語法文件(C++ 1998: ISO/IEC 14882:1998和 C++ 2008: ISO/IEC SC22/WG21 N2723= 08-0233 網站)。 語法以Enahnced BNF、DMS BNF、BGF、SDF 和 Rascal表示法表示。 遺憾的是,C++ 語法似乎沒有得到更新(沒有 C++2003 或 C++11)。

對於另一種方法,您可以考慮搭載現有編譯器。

GCC-XML會將C++“編譯”成XML文件,里面有很多有用的信息; 它可能足以滿足您的目的。

不幸的是,GCC-XML 只維護了 1/4,讓它工作可能是……有趣的。 祝你好運,如果你 go 這條路線。

我最近發現了這個 我還沒有嘗試過,所以不確定它是否有效。 您能否提供有關您正在嘗試開發的工具的更多信息? 我下載了這個語法,因為我正在開發一個檢測工具,這樣我就可以為我的單元測試框架添加覆蓋率信息。

重新閱讀您的評論后...

我認為這個工具完全符合您的需求。

Jared 的鏈接是您可以獲得的最接近上下文無關語法的東西。 某些事情確實需要延遲到以后,但那是 arguments 比 C++ 的上下文敏感語法更好。

更糟糕的是,C++1x 將顯着復雜化語法。 為了完美解析 C++,解析器需要實現足夠多的標准來正確執行重載解析,包括模板參數推導,這反過來需要概念機制、lambdas,實際上幾乎所有語言,除了兩階段名稱查找和異常規范,如果我沒記錯的話,不需要實際實現來成功解析程序。

實際上,如果您可以解析 C++,那么您已經完成了編譯器的一半。

我們的 DMS 軟件再造工具包可通過功能強大的全功能 C++ 解析器獲得。 請參閱http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html這將構建 AST 和符號表,並且可以推斷任何表達式的類型。 DMS 使人們能夠對 C++ 代碼進行任意分析和轉換。

一種“簡單”的轉換是檢測代碼以收集測試覆蓋率數據; 我們將其作為 COTS 工具提供。 請參閱本文以了解 DMS 是如何做到的: http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

編輯 2013 年 9 月(這個答案有點陳舊):DMS 的 C++ 解析器/名稱解析/控制流分析在 ISO-、GNU- 和 Microsoft 變體中處理完整的 C++11。 它還將解析(並保留)包含大多數預處理器條件的源代碼。 與 GCC 或 Clang 不同,它具有驅動解析過程的顯式語法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM