iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 7
0
Software Development

做一個JVM語言系列 第 7

Antlr練習,解析CSV檔

  • 分享至 

  • xImage
  •  

CSV是Comma-Separated Values ,依逗點分隔的值。
測試的樣本,要有一些代表性,
如:

Details,Month,Amount
Mid Bonus,June,"$2,000"
,January,"""zippo"""
Total Bonuses,"","$5,000"

其中**,January,"""zippo"""**,是合法的,第一欄沒有值,第三欄被多個雙引號包住。
而直接給值也是合法的,Mid Bonus,June, ,沒有雙引號包住也可以。
彈性挺大的。

設計的文法,


grammar CSV;

file : hdr row+ ;
hdr : row ;

row : field (',' field)* '\r'? '\n' ;

field
    :   TEXT
    |   STRING
    |
    ;

TEXT : ~[,\n\r"]+ ;
STRING : '"' ('""'|~'"')* '"' ; // quote-quote is an escaped quote

這裏有些符號的意思,之前沒細講,
所謂的Lexer Rules
把本文裏的字(WORD, token,或元素)切出來。

TEXT, STRING大寫是有意義的,表示他們是Tokens。不要誤用。
[裏面是放字元]~[字元] , 其中的**~** 是NOT,不在的意思,整個的意思,是不包含[]裏的字元。**+**表示一個以上。
表示0個以上。有細微的差異。
(裏面是子規則), subrules like (...)?, (...)
and (...)+ are greedy。一些子規則是貪婪的。表示會讓解析程式判斷很久。
?問號代表前面的字元最多只可以出現一次。

這個部分和正規表達示
常常會忘了這些符號所代表的意思,多查幾次就會記得。


上一篇
Antlr:Listener監聽者模式
下一篇
Antlr練習,轉換JSON到XML
系列文
做一個JVM語言12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言