字句解析続き
まず、一番目に考えた実装は、文字列を読んできて、それにmatch-case文と正規表現を使ってぐにょぐにょすればいいんじゃないか。っていう感じ。
function next_token( str ) { match (str) { case /^if/: // if ではじまってたら return TOK_IF; case /^[a-z]/: return TOK_IDENT; ... } }
けど、これだと、トークンが必要になるたびに、文字列をちぎったりくっつけたりするような処理が必要になってくる。
そういう処理を実現するような文法やらルーチンやらが必要になると実装が面倒だし、それに、字句解析という定型処理であるにもかかわらず、使う人が文字単位レベルでの処理を書く必要が出てくる。
さらに、ファイルの内容を一旦全部文字列に変換する必要があるのでファイルがストリームとして使えなくなる。
と、いうような感じで、この案は微妙にダメっぽい感じがする。文字単位の処理をごりごり超抽象的に書けて、かつ、遅延入出力なんかができるようになっていれば、いい感じになりそうな気もしないでもないけど、実装が面倒だし、やっぱりそれでも使う人が文字レベルでなんとかしないといけないような気がする。
で、あんまり本気で考えたわけでもないんだけど、「ファイルは低レベルなもの。低レベルだからバイト単位で処理できないと駄目」っていう考えかたが間違ってるんじゃないか、どうせコンパイラ内では字句解析でちょろっと使うだけだから、正規表現単位でしか使わないんじゃないか。とか、そういうふうに思って考えたのがおとといの分。
でも一般的な正規表現ライブラリってパターンマッチしか考えられてないから(多分)これでやると正規表現コンパイラとDFAインタプリタみたいなのと自分で実装しないといけないような気がする。
まあいいか。最近コード書いてないからリハビリにちょうどいいかもしれない。