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; \n return LINESEP; %%
csvparser.y
%{ #define YYSTYPE char * #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 field field: 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 ごりら
この方向で合ってるのかな?