flex & bison 実験中
2008/04/21
Starbug1の新機能であるチケットの一括登録の情報を、csvで入力を受けることを考えていたんですが、” のエスケープやら改行入りデータとかを考えると滅入ってきたので、flex bison で CSVパーサを作ってみようかと思いました。実験中なのでいつにも増して信憑性の無い情報となっています。間違いがわかったら、修正していきます。
http://www.linux.or.jp/JF/JFdocs/Lex-YACC-HOWTO-4.html を参考にさせて貰いました。
csvlex.l
%{#include<stdio.h>#include"csvparser.tab.h"%}%%\"return QUOTE;[^,"\n]* yylval=strdup(yytext); return WORD;,return SEP;\nreturn LINESEP;%%
csvparser.y
%{#define YYSTYPEchar*#include<stdio.h>#include<ctype.h>int yylex(void);int yyerror(const char *s);int yyparse(void);int yywrap(void);%}%token QUOTE WORD SEP LINESEP%%csv:/* 空 */| fields;fields: field | fields fieldfield: SEP| LINESEP| WORD SEP { printf ("\t%s\n", $1); }| WORD LINESEP { printf ("\t%s\n", $1); }| QUOTE WORD QUOTE SEP { printf ("\t%s\n", $2); }| QUOTE WORD QUOTE LINESEP { printf ("\t%s\n", $2); };%% main(){ yyparse();} yyerror(const char *s){ printf("ERROR:%s\n", s);}int yywrap(){return 1;}
コンパイル
$ flex csvlex.l $ bison -d csvparser.y $ gcc lex.yy.c csvparser.tab.c csvlex.l: In function `yylex': csvlex.l:8: warning: assignment makes integer from pointer without a cast
警告出てる。
実行
$ ./a.exe "abc",def abc def あいいう,え,お,幹事 あいいう え お 幹事 あいう,"jak","ごりら" あいう jak ごりら
この方向で合ってるのかな?