みぃちゃんの頭の中はおもちゃ箱

略してみちゃばこ。泣いたり笑ったり

NFA→DFA変換ルーチンをかく

2014年08月26日 21時59分10秒 | IT・デジタル
きょうは正規表現とのマッチングに使用するルーチンをかきました。使用言語はC++。

正規表現ライブラリは いくつも つくられていて、Boost、GNU regex、PCREなど、たくさん あります。ただ、どれも これも わたしの したいことと すこし ずれているので、マッチング用のルーチンをかいた次第です。

  • 入力を1回スキャンするだけで複数のパターンと照合し、どのパターンにマッチするか検出したい。

  • マッチングで最長一致のパターンを検出するか、一致するパターンを全部検出するか、状況によって つかいわけたい。

  • それぞれのパターンで部分文字列 (たとえば正規表現 a*(bc*)d における bc* の部分) を検出したい。

など、既存のライブラリと微妙に かみあいません。

部分文字列を厳密に検出できるように実装しようと すると厄介です。しかし、微妙な ばあいは正確に検出できないけれど実際には そのような微妙なパターン検出が必要なケースは ほとんど ないので実用上は問題ない、と いう程度まで検出能力を制限すれば容易に実装できそうです。今回は その方法を採用します。

きょう かいたのはNFA (非決定性有限オートマトン) をDFA (決定性有限オートマトン) に変換するルーチン。アルゴリズムは すでに確立されていて、NFAノード間のε遷移からεクロージャ (閉包) を構成し、それぞれの入力と遷移さきからDFAの状態遷移表を作成するだけです (実際には表をつくらずに分枝をのばしました)。順調にコーディングが すすんで動作確認完了。

このままでもオートマトンとして機能しますが、実行時に複数の分枝の なかから該当する分枝を検索して分岐していくのは効率が わるいです。コンパクトなジャンプテーブルをつくるルーチンだけ追加しておこうかな。

※ この記事の本文からは漢字の訓を排除しています。

なつの すずしげバッグ

2014年08月25日 21時56分52秒 | キレイのために
ぷらっと街をあるいていて みつけたバッグ。最大はば25cmほどの ふながたバッグです。本体は すずやかな あおや むらさきいろの繊維で あまれ、ふちや もちてには しろい合皮が つかわれています。いえに いるときに このバッグに必需品 (携帯電話と てちょう) をひとまとめに しておくと、本やファイルをかかえて あちこちの部屋に移動するときも楽です。ねふだの表示は324円。

324円!?

しろい部分があちこち よごれているので やすくなっているのでしょうか。それにしても やすいです。いっとき たのしむだけの消耗品と わりきることも できます。

まよいましたが、結局かわず。

※ この記事の本文からは漢字の訓を排除しています。

USBフラッシュをよくよく みてみれば

2014年08月24日 22時26分04秒 | IT・デジタル
memory02.jpg: USBフラッシュ メモリ

やすかったUSBフラッシュ メモリを2月にかいましたが、よくよく みてみれば このフラッシュ メモリにはアクセス ランプが ありません。

いままで気づかなかったのも ずいぶん のんきな はなしです。Windowsに接続してアクセスした あと、デバイスの とりはずしを指示しても反応が ない ばあいは、ぬいて よいかどうか どうやって判断するのでしょうか。ぬくのに すこし勇気が いります。

※ この記事の本文からは漢字の訓を排除しています。

あみどに しがみつく

2014年08月22日 22時11分02秒 | 日常のあれこれ
bug013.jpg: あみどに しがみついていた むし (ハナムグリ?)

あみどに むしが しがみついていました。ハナムグリやコガネムシの なかまでしょう。ひざしをさけて ひとやすみしているのでしょうか。あしの さきに かぎづめが ついていて、あみをしっかりと つかんでいます。

むしの おなかなんて そうそう みる機会は ありません。むねに こまかい けが びっしりと はえているのを じっくりと観察させてもらいました。

※ この記事の本文からは漢字の訓を排除しています。