ぬか喜び

前日のエントリで書いたパーサを利用して、文字コード変換ツールを作ろうと思った。
Unicodeマッピング・テーブルを読み込めば簡単に作れそうだ。
そう考えて、とりあえずPEGを書いて解析させてみた。



マッピングテーブル(CP932、MS仕様のShift_JIS)
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP932.TXT


PEGの定義はこんな感じ。

NO_SKIP newLine = ("\r" "\n"?) / "\n";
NO_SKIP comment = "#" (!newLine .)*;
NO_SKIP spaces = (comment / " " / "\t" / "\v")*;
NO_SKIP TEXT_NODE byteCode = "0x" (['0' .. '9'] / ['a' .. 'z'] / ['A' .. 'Z'])+;
MAKE_NODE entry = byteCode spaces byteCode?;
MAKE_NODE utfMap = (entry? spaces newLine)*;


こんなシンプルなPEG&ソースファイルなのに、パーサが超メモリ喰う。
いちおう1GBメモリ積んでるマシンでコンパイラがOut of memory乱発!(滝汗)


開発中にもこういうことは何度かあったけれど、ボトルネックがちょっと太くなっただけだったのか……。


ソースを1000行ぐらいに削ると動くようになる。
生成ノード数が多いと落ちるのかと思い、MAKE_NODEとTEXT_NODEを削除してみた。
(この指定がある箇所でノードが生成される)
しかしそれでも落ちる。CTFE関数呼び出しがたくさん行なわれるだけでメモリ喰いまくるのか?
うーんどうすれば良いのか……。
コンパイラの改良を待つのか?


こんなことがあったりするので、最近は自分で言語も作ってしまおうかと思う。(爆)