大規模な商用アプリでカスタム テキスト ファイル形式を読み取るために使用できる優れたパーサー ジェネレーターを探しています。現在、この特定のファイル形式は手作りの再帰パーサーで読み取られますが、その方法が管理不能になるまで、形式は成長し、複雑化しています。
究極の解決策は、この形式に適した文法を構築し、yacc のような実際のパーサー ジェネレーターを使用してそれを読み取ることのようですが、どのジェネレーターを使用するか、または問題を解決する価値があるかどうかを判断するのに苦労しています。まったく。私はANTLRとSpiritを見てきましたが、私たちのプロジェクトには以前の回答を超えた特定の制約があり、それらが私たちに適しているかどうか疑問に思います. 特に、次のものが必要です。
- MSVC で C または C++ コードを生成するパーサー。ANTLR 3 は C++ をサポートしていません。ストレートCを生成すると主張していますが、実際に動作させるためのドキュメントはちょっと混乱しています。
- メモリ使用量が大幅に制限されています。私たちのアプリではメモリが非常に重要であり、わずかなリークでも致命的です。カスタム malloc() を使用するには、パーサーのメモリ アロケータをオーバーライドできるようにする必要があります。または、少なくとも、すべてのメモリを取得する連続したプールをパーサーに与える必要があります (後で一括して割り当てを解除できます)。パーサーの実行可能ファイル自体に約 200kb を割くことができますが、解析で割り当てた動的ヒープは後で解放する必要があります。
- 良い成果。これはそれほど重要ではありませんが、3 GHz プロセッサで 1 秒以内に 100 KB のテキストを解析できるはずです。
- GPL フリーである必要があります。GNU コードは使用できません。
ANTLRworks の IDE とデバッグ ツールは気に入っていますが、その C ターゲットを実際にアプリで動作させるのは大変な作業になりそうです。その話に着手する前に、ANTLR はこの仕事に適したツールですか?
問題のテキスト形式は次のようになります。
attribute "FluxCapacitance" real constant
asset DeLorean
{
//comment foo bar baz
model "delorean.mdl"
animation "gullwing.anm"
references "Marty"
loadonce
}
template TimeMachine
{
attribute FluxCapacitance 10
asset DeLorean
}