Out of Memory

ごめん、忘れてた。

目次

Blog 利用状況

ニュース

2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

aetos

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

Microsoft MVP for Windows SDK July 2007 - February 2008, Microsoft MVP for Visual C++ February 2008 - June 2009
Microsoft MVP for Windows SDK
July 2007 - February 2008
Microsoft MVP for Visual C++
February 2008 - June 2009

アクセサリ

あわせて読みたい

e-Words

アフィリエイト

記事カテゴリ

書庫

日記カテゴリ

コマンドラインパーサ

ちょっと実用的なコマンドラインパーサを作ろう、と思っているわけです。C# で。
困ったことに、コマンドラインパーサってのはどんなアプリでも利用可能ですから、こういうものを作ろうと思い立ってしまうと、これが出来上がるまで他のどんなアプリも作りたくなくなります。俺の悪い癖です。

で、悩んでいるのが、

  • 既存のアプリのコマンドラインの仕様を変えずに移植できるように柔軟性を持たせるか
  • このパーサライブラリを使う以上は使用可能なコマンドラインの仕様にある程度の制限があるのも止むなしとするか

ということ、とか。
まぁほら、後者の方が作るのは簡単なんですけど、前者ができるならそれに越したことは無いじゃない? みたいな。

あとは、パラメータを指定するにしても、世の中にはいろんな方式のアプリがあるわけですよ。
例えば、オプション「/foo」にパラメータ「bar」を指定するのでも、

  1. /foo bar
  2. /foo:bar
  3. /foobar

なんてのがあります。
2と3は技術的にはあまり違いはありません。見た目的には2の方が好きです。
が、1と2には大きな違いがあります。
コマンドラインは Main に文字列配列として渡されますが、1 は /foo と bar が別の要素になるのに対し、2 は単一の要素になります。
当然、1の方が解析は面倒です。「bar」を処理するときに、その前の要素が「/foo」であるか、そうでないかでは意味が違ってくるからです。
このため、コマンドラインパーサは、簡易な状態遷移機械ということになります。
ちなみに、3つの中では見た目的に1が一番好きです。

このように、コマンドの順序を意識しなければならないこともあれば、順序はどうでもいい場合もあります。
例えば、オプション /hoge と /hage があるとき、以下の2つは

  • /hoge /hage
  • /hage /hoge

どっちでもいいじゃないですか。

もっと複雑な例になると、/foo:X=1,Y=2,Z=3 なんていう例も考えられます。もちろん、/foo:Z=3,X=1,Y=2でも同じ意味でなければなりません。
正直、こんなのをパースするのは面倒です。
で、正規表現を使っちゃえばいいじゃないか、と思い立ったわけです。キャプチャしてくれますから。

ただですね、上のは敢えてスペースを詰めて1つの文字列になるように書きましたが、/foo x 1 y 2 z 3 でも同じ意味でいいじゃないかと。
で、そういう場合に、

  1. /foo
  2. /foo x
  3. /foo x 1 y
  4. /foo x 1 /bar

1~3なんかは不正なコマンドラインなわけですが、正規表現でこれらを不正だと見破るのは面倒くさいです。
4 は正当なコマンドラインですが、「/foo x 1」と「/bar」は別のオプションです。が、正規表現だと、「/foo」と「x」と「1 bar」に分けちゃったりするのです。
一番簡単な方法は、/foo:x=1 /foo:y=2 /foo:z=3 という風に書かせて、可変個引数を認めないことですが、それもかっこ悪いなぁ、と。

面倒くさいです。

投稿日時 : 2008年7月28日 14:32

Feedback

# re: コマンドラインパーサ 2008/07/28 15:58 ちゃっぴ

そう、めんどくさい。なので framework 側で用意してくれないかと。

自分で作るなら、2 ですね。それでもめんどくさいけど。

# re: コマンドラインパーサ 2008/07/28 19:20 ネタ好き未記入

Win32で便利なAPIがあったような気が・・・

# re: コマンドラインパーサ 2008/07/28 19:22 ネタ好き未記入

でも、何はともあれフルスクラッチするのが楽しいのですよね♪
私もアセンブラ言語を作って、コマンドラインで起動できるようにしようと思っています。
もちろん、既存のライブラリは使いません。
全てフルスクラッチです。
これが男のロマンだと私は思います♪

# re: コマンドラインパーサ 2008/07/28 19:44 シャノン

> なので framework 側で用意してくれないかと。

まったくです。
MFC はおせっかいなほどのパーサを備えているというのにね。

> Win32で便利なAPIがあったような気が・・・

CommandLineToArgvW かな。
これは一本の文字列をスペースで区切って配列にしてくれる関数で、Main の前段階で使うやつですね。
ところで、この関数名はどう読むんでしょうか。「コマンドライン トゥ アーグヴ ウ!」でしょうか?

> でも、何はともあれフルスクラッチするのが楽しいのですよね♪

ですね♪

> 私もアセンブラ言語を作って、コマンドラインで起動できるようにしようと思っています。
> もちろん、既存のライブラリは使いません。

俺はそこまでマゾくはなれませんorz

# re: コマンドラインパーサ 2008/07/29 6:13 ネタ好き未記入

>CommandLineToArgvW
そうこれこれ。でも、なんて読むんだろうw
MSDNには日本人向けの振り仮名が欲しいですよね。

タイトル  
名前  
Url
コメント