std.regexp std.file

講義サボって暇なので適当なコードを書きました。phobosregexpとfileの練習みたいなものです。
予約語にhtmlタグを埋め込みます。使い方はコード読めばわかると思います。

import std.c.stdio;
import std.file;
import std.regexp;

static char[] 

static char[][] patterns = [
    "abstract",
    /* 予約語 省略 */
    "with"
];

int main(char[][] args){
    if (args.length == 1){
        printf("file name is not appointed.");
        return 0;
    } else if (args.length == 2){
        args.length = 3;
        args[2] = args[1];
    }

    char[] s = cast(char[])read(args[1]);
    RegExp reg;
    foreach (char[] pat; patterns){
        pat = r"([\s|\[|\(|\{])(" ~ pat ~ r")([\s|\[|\(|\{])";
        reg = new RegExp(pat, "g");
        s = reg.replace(s, "$1<span class=\"d_keyword\">$2</span>$3");
    }

    write(args[2], s);
    return 0;
}

かなりいい加減に作っているのでかなり控えめにいって相当正確じゃないです。
例えばファイル頭の予約語、importとか、に余裕でマッチしません。コメントも文字列リテラルも無視です。酷い。
さらにいうとファイルが存在しなかったりロックされていたりすると当然エラーです。
書き込むファイルをロックして実行したところ。

Error: newhtml.d: 繝励Ο繧サ繧ケ縺ッ繝輔ぃ繧、繝ォ縺ォ繧「繧ッ繧サ繧ケ縺ァ縺阪∪縺帙s縲ょ挨縺ョ繝励Ο繧サ繧ケ縺御スソ逕ィ荳ュ縺ァ縺吶€

としかられました。なんだそれ。
このコード自体以外テストしてないので、他にもまずい部分があるかもしれません…
いないとは思いますが、使わないほうがいいです。ボクも使わない。
本当にこの手の物が必要になったときはスクリプト言語で誰だって書くよなあ…
一応出力結果。

import std.c.stdio;
<span class="d_keyword">import</span> std.file;
<span class="d_keyword">import</span> std.regexp;

<span class="d_keyword">static</span> <span class="d_keyword">char</span>[][] patterns = [
    "abstract",
    /* 予約語 省略 */
    "with"
];

<span class="d_keyword">int</span> main(<span class="d_keyword">char</span>[][] args){
    <span class="d_keyword">if</span> (args.length == 1){
        printf("file name <span class="d_keyword">is</span> not appointed.");
        <span class="d_keyword">return</span> -1;
    } <span class="d_keyword">else</span> <span class="d_keyword">if</span> (args.length == 2){
        args.length = 3;
        args[2] = args[1];
    }

    <span class="d_keyword">char</span>[] s = <span class="d_keyword">cast</span>(<span class="d_keyword">char</span>[])read(args[1]);
    RegExp reg;
    <span class="d_keyword">foreach</span> (<span class="d_keyword">char</span>[] pat; patterns){
        pat = r"([\s|\[|\(|\{])(" ~ pat ~ r")([\s|\[|\(|\{])";
        reg = <span class="d_keyword">new</span> RegExp(pat, "g");
        s = reg.replace(s, "$1<span class=\"d_keyword\">$2</span>$3");
    }

    write(args[2], s);
    <span class="d_keyword">return</span> 0;
}

こんなの見せられても困る、という感じ。
追記。パターンマッチが不思議すぎる。何で閉じるほうのカッコはないの?思いつきで書くとよくない。
更に追記。「<」や「>」などの記号を置き換えてない…