正規表現と文脈自由文法の話

This entry was posted by on Friday, 27 March, 2009

http://d.hatena.ne.jp/wasisan/20090321/p1

まず一言。E-Mailアドレスにのみ正しくマッチする正規表現というものは存在しません。それから、RFCではこういうのはたいていBNFで記載されているので、文脈自由文法が使えるならかなりそのまんまで書けるので非常に楽です。

一方で、「正規表現本来の目的=トークンの記述」というのには首をかしげます。grep使ったことがないんでしょうか。メールアドレスを正規表現でマッチさせるというシチュエーションはいろいろ考えられますが、MTAやちゃんとした MUAを実装するのでもない限り、よくある用途は「メールアドレスフィールドに突っ込まれたユーザの入力がメールアドレスっぽいかどうか検証する」といった程度のものであり、すなわちhttp://hal456.net/qdmail/validationで書かれているような程度のことではないかと思います(ってこれMTAですが)。たとえばウェブ系ではユーザの誤入力(例えば名前とメールアドレスのフィールドを勘違いしたとか)を検出するといった簡便な用途が想定され、その程度の単純なバリデーションが大元の話題で要求されていたのだろうと思います。

以前、kazuさんがParsecについて書いていたときにも違和感を感じたのですが、何といいますか、文脈自由文法って、そんなエラいですか? 文脈自由文法は正規表現よりも上のクラスの言語なので、マッチできる対象が広がるのは確かですよ。でもその論法を持ち出すならばチューリングマシンが最強ということになってしまう。そうではないはずです。

正規表現には正規表現なりのいいところがあります。私に言わせれば、そのいいところというのは、それなりの簡潔さでそれなりの表現力があるというところです。世の中には、正規表現をちょっと利用するだけでだいぶ楽になるけど真面目に書くと案外面倒くさい、という問題領域がかなりあります。そういう問題領域を素早く解くために正規表現は出て来ます。sed(ed)、grep、awkなどが広まったのはまさにそれが原因でしょう。

もちろん正規表現を使ってプログラミング言語をパースするとかいい出すと「そりゃー変でしょ」って思うし、BNFで記述された仕様を実装して動作を確かめるとなればどうしたって結果的にパーサを書くことになります。でもそれって単にやってることが正規表現の仕事ではないからではないでしょうか。

そういえばxtalでは正規表現のかわりにPEGにしたという話ですが、どうなったんでしょう?

2 Responses to “正規表現と文脈自由文法の話”

  1. ると

    トラックバックが上手くできないので、こちらに書きます。
    http://slashdot.jp/~ruto/journal/471449
    要約: 「正規表現が手軽だから」以上が無く、正規表現から上位のクラスの言語用のパーサへ変換する機能があれば良いことになってしまう。スクリプト言語の機能としての正規言語マッチャは、正規言語に限れば速いという以上のメリットは無いと思う。

  2. きしもと

    正規表現を万能ナイフのように思わないように、ってぐらいのことなんじゃないでしょうか。それと、YACCのような大鉈を持ち出さなくてもCFGが使えるよ、という紹介というか。
    CFGと正規表現が相互に補完しあってる例としては、典型的な言語処理系のフロントエンドがそうじゃないですかね? lexは正規表現で切り出してますし(まぁ状態持たせたりとかいろいろしてはいますが)。