Bison を使用してパーサーを生成するプロジェクトがあります。プロジェクト自体は SCons でビルドされており、私のコードはすべて C++ で書かれています。最初に決定したことの 1 つは、コードを 3 つの主要なディレクトリに分割することでした。includes、src、および test です。最初のディレクトリにはパブリックヘッダーのみを含めることができ、srcには実装とプライベートヘッダーの両方を含め、 testにはテストのみを含めることができます。
現在、この規則は 3 つのファイルによって破られています: stack.hh、position.hh、およびlocation.hh。Bison を C++ モードで使用しているため、これらは Bison によって自動的に生成されます。しかし、引数--defines=include/namespace/parser.hppを使用してパーサーのヘッダーを配置する場所を設定できますが、これらの 3 つのファイルを配置する場所を定義する方法が見つからないため、同じフォルダーに保存されます。src/namespace/parser.cpp .
きれいに処理する方法を知りたいです。これまでのところ、私は 2 つのアイデアを思いつきました。1 つ目は、%defineとapi.locationを使用して、現在使用されているクラスに設定し (Bison がそれらのファイルを再度生成するのを防ぎます)、それらのファイルをそこに移動することです。もう 1 つは、自分で位置と場所のクラスを再実装し、上記の API を使用してそれらを設定することです。1 つのアイデアは汚いハックのように聞こえますが、もう 1 つのアイデアは、このような単純なタスクのやり過ぎのように思えます。
パーサーによって使用されるヘルパーがインクルードディレクトリに配置され、 srcには実装のみが含まれていることを確認する他の (クリーンな) 方法はありますか?
編集:
これらのファイル (またはその代替ファイル) をパブリック ヘッダー フォルダーに配置する必要があるのは、 Bison によって生成されたparser.hppファイルに含まれているためです。その結果、parser.hpp を含むファイルを検索フォルダーのリストに追加せずにコンパイルすることはできません。現在、ソース フォルダーへのパスをインクルードに追加する必要があります。これにより、コンパイラーは、生成された parser.hpp ヘッダーの 1 か所でのみ必要な 3 つのファイルを見つけることができ、それを制御することはできません。意味不明で紛らわしいので、直していただきたいです。