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

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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください