flex & bison 実験中

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
ごりら

この方向で合ってるのかな?

Leave a Comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.