0753デフォルトの名無しさん
2017/06/14(水) 23:53:09.01ID:nXcqV3BVとりあえず、行継続もプリプロセッサディレクティブの処理もエラーチェックも無し、
コメントと文字列だけでいいなら flex ならこう書ける。
https://ideone.com/NbLVjc
本当は '"' みたいな文字定数も想定しなきゃまずいけどね。
もちろん、flex を使わなくてもできる。
yylex を手書きするなら、まず 1 バイト読んで
switch ( c){
case '"': read_string(); break;
case '/': read_comment(); break;
みたいにするのが伝統的な方法だったりする。
この方法では switch から出る前にトークンを完結させる。
コメントや文字列定数の中と、それ以外の部分で文法が違うから
別の処理になっていると理解してほしい。
こうしなければならないわけではなく、テーブル駆動とかステートマシンが好みならそうすればいい。
重要なのは、yylex を 1 回呼べばトークンが 1 個完結しているということ。
もちろん Perl でも同じやり方はできる。できるけど…… Perl ですよ?
助けてくれるモジュールがあるんだから使ってみない? Parse::Lex とか。
flex をかじっておけば理解しやすいと思うよ。