RFC 2234風パーサーを目指してantlrで定義 2008/09/13
2008/09/13

ふとCSVのパーサーをつくろうと再び考え、今回はANTLRを使ってみることに。
オレオレDSLをつくってみたいのでその練習もかねて。

改行をCRLF以外にLFでもうけつけるようにしてみたことと、
トークンTEXTDATAを定義するのCOMMA 、CR、LF、DQUOTEでないものはというふうに乱暴な定義にしてみた。
これうごくのだろうか。。。
まだ動作させていない....


grammar Csv;
@header {
package csv;
}
@lexer::header {
package csv;
}
// file = [header CRLF] record *(CRLF record) [CRLF]
file: record ((LF | CRLF) record)*;
// header = name *(COMMA name)
header
: name (COMMA name)*;
// record = field *(COMMA field)
record
: field (COMMA field)*;
// name = field
name: field;
// field = (escaped / non-escaped)
field
: escaped
| nonescaped;
// escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE
escaped
: DQUOTE (TEXTDATA|COMMA|CR|LF|DQUOTE DQUOTE)* DQUOTE;
// non-escaped = *TEXTDATA
nonescaped: TEXTDATA*;

// COMMA = %x2C
COMMA
: ',';
// CR = %x0D ;as per section 6.1 of RFC 2234 [2]
CR : '\r';
// DQUOTE = %x22 ;as per section 6.1 of RFC 2234 [2]
DQUOTE : '"';
// LF = %x0A ;as per section 6.1 of RFC 2234 [2]
LF : '\n';
// CRLF = CR LF ;as per section 6.1 of RFC 2234 [2]
CRLF: CR LF;
// TEXTDATA = %x20-21 / %x23-2B / %x2D-7E
TEXTDATA
: (~(COMMA| CR| LF| DQUOTE))+
;

: