flexとかいう賢いやつを見つけた 字句解析

字句解析プログラム生成器とでも呼べばいいのだろうか。なんか使えそうなのを発見したのでメモ書きです。

字句解析ルールを簡単に記述するだけでそれを満足するコードを出力してくれるとても賢い子です。cで使えます。

test environment

$ uname -a
Linux ubuntu 4.4.0-87-generic #110-Ubuntu SMP Tue Jul 18 12:55:35 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

requirement

$ sudo apt install flex

example

hoge という文字列の個数を数えます。

count.c

#include<stdio.h>
extern int hoge_count;
extern int yylex(void);
int main(int argc, char **argv){
  yylex();
  printf("%d\n", hoge_count);
  return 0;
}

lexer.l


int hoge_count = 0; %% hoge hoge_count++; . \n

Makefile


count: count.o lexer.o -lfl gcc count.o lexer.o -lfl -ocount count.o: count.c gcc -c count.c lexer.o: lexer.c gcc -c lexer .c lexer.c: lexer.l flex -t lexer.l > lexer.c

後はビルドして入力を食べさせると hoge の出てくる回数をはくことが確認できます。
flexで記述した字句解析は yylex() という関数をたたくことで呼び出しが可能らしい。
Makefile無駄が多くてごめんなさい勉強中なんです。
ラップしてpythonとかrustとかで使えそうですよねってかもうありそう。