write ahead log

ロールフォワード用

lexを使う

少し前に構文解析プログラム入門の定番である電卓でも作ってみようかなとRubyで書いた.
わかったことはとにかくめんどくさい.
電卓程度なので手抜きをたくさんできるんだけど、実際、+をAddに変更しようかと思うと、もっとちゃんとした字句解析も必要になる.
正規表現と状態を組み合わせて処理していけば良さそうだけど、やる気無くした.めんどいし.

そこで定番だけど、lexの使い方を調べてみた.
なんだかんだyacc/lexは使ったことがなかったのでためになる.

別に言語の構成のためだけでなく、割となんにでも使えそうな感じがする.便利ツールや.

サンプルとしてCのプログラムからコメントを取ってくるものを作った.
というか参考にしたサイトからほぼ写経.
一部いじったんだけど、元のコードはshebangも改行扱いしてるっぽいし、Cが対象じゃない?のかな.

gist863e59cafeba070fe736

以下のようなサンプル(test.c)を用意して

/*
 * Hello, world program.
 * This is a sample program.
 */

int main() {
  printf("Hello, world\n");
  /* hello, worldのテスト */
  return 0;
}

下記コマンドでコンパイル&実行

twinbird@:~/lab/yacc_lex$ lex lex_sample.l 
twinbird@:~/lab/yacc_lex$ gcc lex.yy.c -o lex_sample
twinbird@:~/lab/yacc_lex$ ./lex_sample < test.c 

 * Hello, world program.
 * This is a sample program.
  hello, worldのテスト 
11 lines read.

手軽な割に面白い.

あと、Lex作ったのがあのGoogleのエリック・シュミットってのも初めて知って驚いた.
なんでもできるんだなあの人.

参考 lex(flex)の使い方(簡略版) wikipedia - Lex