スキャナ
http://d.hatena.ne.jp/higepon/20080912/1221232779
スキャナかあ
私が昔schemeのインタプリタ書いたときは
SJISとEUCくらい読めればよかったんで
おおざっぱにハードコーディングしてた
こんな感じで:
letter [\x00-\xff] kanji ([\x80-\xff]{letter}) ident ({kanji}|{mark}|{alpha}|{digit})*
いまならそうさのう
ElkhoundとかDParserみたいなGLRパーサ使えば
スキャナレスにできるからそうしてしまうかのう
higeponさんの文脈の場合スピードが必要らしいから
GLRパーサで納得できるのかどうかは未知数だけれども。
leafの場合は、パーサはもちろんcaperで
スキャナは手書きです。
特別な識別子の取得とかはstd::mapで別段困ることもないので。
もちろん最速を目指すとだめだと思うけど、
プロファイルしたらホットスポットはそこじゃなさそうな気がする。
そうでもないかな。
よくわかんない(だめじゃん)。
charをテンプレートパラメータにして
wchar_tでも好きなオブジェクトでも使えるような
スキャナジェネレータも作ろうかなと思ったけど
caperをGLR対応にしてスキャナなんて概念なくすのが本道かなって
思ったので手をつけてなかったり。
(私の場合、興味の対象が速度よりも利便性にあるので)
なんていいつつもそっちはそっちで大仕事なのでそれも
手をつけてないんですが。
手書きで困らないってほうが大きいけれども。
ちなみに
boostのregexは(int|char|short)なんて正規表現を書いたときに
どれにヒットしたのかO(1)で判定できない(っぽい)のでいまいち。
最近ついてきた正規表現を静的に展開できるやつはどうだろう?
Xpressiveだっけ?