argpやC++のboost::program_optionsのサブセットなど、よく知られているコマンドライン引数パーサーはたくさんあります。
たとえば、最近、C++で次のような単純なシナリオを解析できるようにするものを作成しようとしました。
int main (int argc, char *argv[]) {
auto state = parse (argc, argv);
const auto foo = mandatory<int> (state, {'f', "foo"});
const auto bar = optional_with_default<int>(state, {'b', "bar"}, 42);
const auto frob = optional<std::string> (state, {'F', "frob"});
if (!frob) {
...
}
}
しかし、位置に依存しないフラグの解析は簡単ではないことがすぐにわかりました(たとえば-fgx
、と同じになります-f -xg
)。その後、値引数を使用して位置に依存しないフラグをスローすることは、実際には簡単ではなくなりました(たとえばtar -xvzf frob.tar.gz
)。
問題は経験論によってのみ明らかになりました。たとえば、この検索では何も見つかりませんでした。
このトピックに関する優れたリソースを知っていますか?あなた自身のベストプラクティスは何ですか?
注:いくつかのC ++の例に名前を付けていますが、この質問は言語に依存しないはずです。アルゴリズムと一般的な提案を求めています。