23

レガシーC/C ++ブレンドプロジェクトの単体テストを支援するために、一種のコードジェネレーターに取り組んでいます。宣言からスタブコードを生成できる独立したツールはありません。だから私はそれを作ることにしました、それはそれほど難しいことではないはずです。

どうか、誰でも私に標準の文法リンクを教えてください。yacc言語でよりよく説明されています。

私が車輪の再発明をしていないことを願っています。その場合は私を助けてください。

よろしく、ケビン

4

6 に答える 6

24

C ++ FAQ Liteから:

38.11yacc対応のC++文法はありますか?

必要な主なyacc文法は、EdWillinkによるものです。エドは、自分の文法がISO / ANSI C ++標準に完全に準拠していると信じていますが、それを保証するものではありません。「文法はそうではありません」と彼は言います。アクションルーチンなしの文法、またはダミーアクションルーチン付きの文法を取得できます。対応するレクサーを取得することもできます。彼が文脈自由パーサーをどのように実現するかに興味がある人は(すべてのあいまいさと、解析が完了した後に後で実行する少数の修復をプッシュすることによって)、彼の論文の第4章を読むことをお勧めします。

テンプレート、例外、名前空間をサポートしていない非常に古いyacc文法もあります。さらに、それはいくつかの微妙な方法でコア言語から逸脱しています。その文法はここまたはここで入手できます。

于 2009-03-05T03:37:43.747 に答える
4

私は最近、C++ 用の文法ファイル (C++ 1998: ISO/IEC 14882:1998および C++ 2008: ISO/IEC SC22/WG21 N2723=08-0233 ) をgrammarware websiteで見つけました。文法は、拡張 BNF、DMS BNF、BGF、SDF、およびラスカル表記で表されます。ただし、C++ 文法が更新されていないように見えるのは残念です (C++2003 または C++11 はありません)。

于 2012-11-14T12:33:34.523 に答える
3

Jaredのリンクは、取得できる文脈自由文法に最も近いものです。特定の事柄は後で遅らせる必要がありますが、それはC++の文脈依存文法よりも優れているいくつかの議論によるものです。

さらに悪いことに、C++1xは文法を大幅に複雑にします。C ++を完全に解析するには、パーサーは、テンプレート引数の推定を含む、オーバーロード解決を正しく実行するための十分な標準を実装する必要があります。これには、概念メカニズム、ラムダ、および事実上ほとんどすべての言語。ただし、2段階の名前検索と例外仕様を除きます。これらは、正しく思い出せば、プログラムを正常に解析するために実際の実装を必要としません。

事実上、C ++を解析できるのであれば、コンパイラーの途中です。

于 2009-03-05T06:00:01.033 に答える
2

最近これを見つけました。私はそれを試したことがないので、それがうまくいくかどうかはわかりません。開発しようとしているツールについて詳しく教えてください。単体テストフレームワークのカバレッジ情報を追加できるようにインストルメンテーションツールに取り組んでいるため、この文法をダウンロードしました。

コメントを読み直した後...

このツールはあなたのニーズにぴったり合っていると思います。

于 2009-03-05T03:41:35.203 に答える
2

別のアプローチとして、既存のコンパイラをピギーバックすることを検討できます。

GCC-XMLは、C++ を多くの有用な情報を含む XML ファイルに「コンパイル」します。あなたの目的には十分かもしれません。

残念ながら、GCC-XML は 1/4 しか維持されておらず、それを機能させることは...興味深いことです。運が良ければ、このルートで行けます。

于 2010-07-26T04:20:03.297 に答える
1

DMS Software Reengineering Toolkitは、堅牢でフル機能のC++パーサーを使用して入手できます。http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.htmlを参照して ください。 これにより、ASTとシンボルテーブルが作成され、任意の式のタイプを推測できます。DMSを使用すると、C++コードで任意の分析と変換を実行できます。

1つの「単純な」変換は、テストカバレッジデータを収集するためにコードをインストルメント化することです。これをCOTSツールとして提供しています。DMSがどのように機能するかを理解するには、このペーパーを参照してください: http ://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

2013年9月の編集(この回答は少し古くなっていました):DMSのC ++パーサー/名前解決/制御フロー分析は、ISO、GNU、およびMicrosoftのバリアントで完全なC++11を処理します。また、ほとんどのプリプロセッサ条件を含むソースコードを解析(および保持)します。GCCやClangとは異なり、解析プロセスを駆動する明示的な文法があります。

于 2009-06-17T15:13:38.593 に答える