この関連する SO の質問には、コマンド ライン パーサー ライブラリに関する多くの役立つ提案があります。なぜ従来のパーサー ジェネレーターが問題を解決するのに適していないのかに焦点を当てたいと思います。
次の 2 つの基本的な理由があります。
コマンド ライン構文は、単純で覚えやすく、一般的なスタイル/規則で他のコマンド ライン構文と一貫性があり、構文上のノイズが最小限である必要があります。従来の PGS の問題は、各文法が他の文法とは異なり、明確な構文解析の必要性に悩まされていることです...これは、構文上のうるささにつながる傾向があります。(わかりました、規律があれば、これらのトラップを回避できますが...)
対照的に、典型的な引数パーサー ライブラリの API は、プログラマが一貫したスタイルを使用することを奨励します。例-x
vs --longForm
、最初--
のオプションは、これ以上オプションがないことを意味します。また、「言語」はあいまいさを気にしないため、プログラマーはこれを非公式に (過剰な構文を使用せずに) 整理したり、構文を単純化したりすることができます。
パーサー ジェネレーターは、解析ツリーを生成するか、コードを文法に埋め込む必要があります。どちらもコマンド ライン解析には理想的ではありません。これを処理するためにアプリケーション コードが複雑になるためです。
対照的に、典型的な引数パーサー ライブラリは、扱いが簡単なフラットなデータ構造を作成または設定します。
また、パフォーマンスとメモリ使用量について過度に心配しているようです。
... 不必要な機能 (およびメモリ) でコードが乱雑にならないように、解析を静的にする必要があります。
最初の観察は、おそらく問題ではないということです。ランタイム オブジェクトの数とサイズは、アプリケーションの残りの部分に比べておそらく些細なものです...そして、通常の JVM の起動中に引数が解析される前に発生するすべての隠し要素...およびその後。
2 つ目の観察結果は、PGS ベースのソリューションには、同等のオーバーヘッドがある可能性があるということです。(たとえば) 解析ツリーを生成することに加えて、生成されたパーサーは、文法固有のパーサー テーブルの束を初期化して保持する必要もあります。もちろん、生成されるパーサー コードも大きくなる傾向があります。