如何匹配最后一行没有换行符的文件 结束。当我使用注释行(w / EOF)时,解析器会进入什么状态 看起来像一个无限循环(即它挂起)。
这是一个语法 - 主要是借用tparr的作品
grammar csv;
prog : row+ ;
row : field (',' field)* NL;
// row : field (',' field)* (NL|EOF); // doesn't work
field : STR | QSTR | ; // field can be empty
STR : ~[\n,"]+ ;
QSTR : Q (QQ|~'"')* Q ;
NL : '\n';
fragment QQ : '""' ;
fragment Q : '"' ;
这是相应的数据文件。
Details,Month,Amount
Mid Bonus,June,"$2,000"
,January,"""zippo"""
Total Bonuses,"","$5,000"<EOF is on the same line>
答案 0 :(得分:2)
解析器进入无限循环,因为您的rule
行(包含EOF
的变体)可以在末尾匹配空输入字符串:
field
可以匹配空字符串(',' field)*
量词,*
显然可以匹配空字符串
EOF
令牌无法消耗(即它无限次出现),因此可以多次匹配。不要将行视为以换行符结尾,为什么不将换行符视为行分隔符:
prog : row (NL row)* EOF;
row : field (',' field)*;
未经测试但应该可以正常工作。