我如何匹配最后一行末尾没有换行符的文件。当我使用注释行(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 : '"' ;
Run Code Online (Sandbox Code Playgroud)
这是相应的数据文件。
Details,Month,Amount
Mid Bonus,June,"$2,000"
,January,"""zippo"""
Total Bonuses,"","$5,000"<EOF is on the same line>
Run Code Online (Sandbox Code Playgroud)
解析器进入无限循环,因为您的rule行(包含 的变体EOF)可以在末尾匹配空输入字符串:
field可以匹配空字符串(',' field)*由于*量词,显然可以匹配空字符串EOF被消耗(即它出现无限次),因此可以多次匹配。与其将行视为以换行符结尾,不如将换行符视为行分隔符:
prog : row (NL row)* EOF;
row : field (',' field)*;
Run Code Online (Sandbox Code Playgroud)
这尚未经过测试,但应该可以正常工作。