2009-03-05 16 views
18

私はレガシーC/C++ブレンドプロジェクトの単体テストを支援するために、ある種のコードジェネレータを開発しようとしています。私は宣言からスタブコードを生成することができる独立したツールを見つけることはできません。だから私は1つを作ることにしました。C++言語の標準BNFまたはYACC文法はどこにありますか?

誰でも私に標準的な文法リンクを教えることができます。これは、yacc言語でよりよく記述されています。

希望私は車輪を再発明していないよ、その場合は私を助けてください。

よろしく、 ケビンC++ FAQ Liteから

+0

宣言からスタブコードを生成するには、まず宣言を解析する必要があります。実際には完全なC++パーサーを意味します。あなたは本当にこれをしたくありません。 –

答えて

2

別の方法として、既存のコンパイラでピギーバックを行うことが考えられます。

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

残念ながら、GCC-XMLは1/4のみのメンテナンスであり、動作させることは面白いことがあります。あなたがこの道を行くならば、幸運。

20

:あなたは をお勧めします

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

主yacc文法はエドWillinkからです。 Edは彼の 文法がthe ISO/ANSI C++ standardに完全に準拠していると信じていますが、 は「文法は ではありません」と怒っています。 the grammar without action routinesまたはthe grammar with dummy action routinesを入手できます。あなたは でもthe corresponding lexerを得ることができます。 ( が完了したパース後に、後に行われるために、すべての 曖昧プラス 修理の少数を押して)彼は 文脈自由パーサを実現する方法で 興味がある人のために、あなたはの 第4章を読みたいと思うかもしれませんhis thesis

テンプレートをサポートしない非常に古いyacc文法 もあります。 例外も名前空間もありません。それに加えて、 は、 の中核言語から逸脱しています。 文法hereまたはhereを取得できます。

+2

C++を実際に解析する必要がある場合は、実際に動作する機械が必要です。 「怒りには使用されません」とは、実際のC++コードでは機能しません。 (私はこの答えがなぜ完全に無効であるかを考えれば、何度もこの答えが好まれていたか/何度もupvotedされているのか分かりません)。 –

+1

@Ira:なぜそれがupvotedの私の推測は本当に何も良いことはないということです。 C++の解析は難しいです。 –

+1

アイラは正しいです。あなたはおそらくあなたの時間を無駄にしてしまうでしょう。私はあなた自身の建物のために、ウサギの穴を突っ込んでいます。あなたがしたいことが学ばれるならば。しかし、仕事をやりたいのであれば、箱から出てきたものを手に入れることをお勧めします。 DMSツールは、さまざまな言語をカバーし、プロジェクトで役立つ追加機能を備えているという点で、他にも利点があります。あなたの時間がお金の価値がある場合(つまり、楽しんでいない場合)、価格は合理的です。 –

1

最近ではthis oneが見つかりました。私はそれを試していないので、それが動作するかどうかは分かりません。開発しようとしているツールの詳細を教えてください。この文法をダウンロードしたのは、私が計装ツールを使っているので、unit test frameworkのカバレッジ情報を追加できるからです。再読み込みあなたのコメントの後

...

私はthis toolは正確にあなたのニーズに合うと思います。

+0

にあることに注意してください。実際には何かに取り組んでいます。ユニットテストフレームワーク1つの翻訳単位をテストするには、実行可能なバイナリを生成するために外部参照を提供する必要があります。したがって、宣言を見つけてスタブ定義を生成するためにソースコードを解析しようとしています。 –

2

Jaredのリンクは、文脈自由文法に最も近いものです。ある事柄は後で遅れる必要がありますが、それはC++の文脈依存文法よりも優れた議論です。

さらに悪いことに、C++ 1xは文法をかなり複雑にします。パーサーは、C++の完璧な解析を行うために、テンプレート引数の控除を含むオーバーロード解決を正しく行うための十分な標準を実装する必要があります。これは概念メカニズム、lambdasを必要とします。 2段階の名前検索および例外仕様を除いて、正しくリコールすれば、プログラムを正常に解析するための実際の実装は必要ありません。

C++を解析できるなら、実際にはコンパイラの途中です。

+0

名前解決を完全に行うことができない場合は、C++コンパイラの近くにはいません。解析は名前解決よりはるかに簡単です。 –

+1

いいえ、解析には名前解決が必要です。それが私の主張です。 C++の文法は悪いことです。 – coppro

+0

GLRパーサーを使用する場合、C++解析では名前解決が必要ありません。実際には、それは非常に簡単で、毎日DMSツールを使用しています(www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html)。ローカルのあいまいさに耐えられないLALR(1)パーサーを使用することを主張するならば、解析していくうちに名前解決しなければならないが、それは混乱だということに同意するが、そうしない理由がある。局所的なあいまいさでもC++の名前解決を行うのはまだかなり難しいですが、私は許してくれますが、パーサに絡まったときほど厄介ではありません。 –

1

DMSソフトウェアリエンジニアリングツールキットは、堅牢な フル機能のC++パーサーで入手できます。 http://www.semanticdesigns.com/Products/FrontEnds/CppFrontEnd.html を参照してください。ASTとシンボルテーブルを構築し、任意の式のタイプを推論できます。 DMSを使用すると、C++コード上で任意の分析および変換 を実行できます。

"簡単な"変換は、テストカバレッジを収集するコードをインスツルメントしています。 data; COTSツールとして提供しています。 DMSはそれをしない方法を理解するために、この論文を参照してください。 http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf

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

+0

stackoverflowはオープンソースやフリーのソリューションを直接支持していませんが、一般的に、解決策を直接指していない畳み込みリンクを置くことは悪い考えです。本当にあなたのツールを宣伝したいのであれば、少なくとも、企業の宣伝と壁にダウンロードされたリンクを読まなくても使えるいくつかのコード例と依存関係があるページを指してください。 –

+0

OPは文法が欲しいと言っていましたが、実際の問題はC++を解析してスタブを生成するための情報を抽出することでした。私の答えは、実際の問題を解決する方法を示しています。実用的な文法を得るという非現実的な考え方を避けています(名前解決の問題を解決せずに構文解析を行っています。作業)。この「複雑なリンク」は、実用的な答えを直接指しています。 –

+0

質問が実用的ではないと思うなら、意見をファンにする必要はありません。質問に答えるために他の誰かがそれに答えるようにしてもらい、質問を答えさせ、正しいことを証明させてください。第二に、私はそのページに行って何の答えも見ることができませんでしたが、例やダウンロードリンクがないフロントエンドについてのマーケティング宣伝がありました。実際の回答がある場合は、回答を編集してサイトがダウンした場合に追加してください。 –

4

私は最近C++(C++ 1998 ISO/IEC SC22/WG21 N2723 = 08から0233ISO/IEC 14882:1998とC++ 2008)のためのいくつかの文法ファイル見つけたgrammarware websiteでは。文法は、Ennnced BNF、DMS BNF、BGF、SDFおよびRascalの表記で表されます。ただし、C++文法は更新されていないようです(C++ 2003やC++ 11はありません)。

関連する問題