antlr4语法-如何匹配EOF/NL

antlr4 grammar - how to match EOF/NL

我如何匹配最后一行没有换行符的文件 结尾。当我使用注释行 (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,",000"
,January,"""zippo"""
Total Bonuses,"",",000"<EOF is on the same line>

解析器进入无限循环,因为您的 rule 行(包含 EOF 的变体)可以匹配末尾的空输入字符串:

  • field可以匹配空串
  • (',' field)*显然可以匹配空串,因为*量词
  • EOF令牌不能被消耗(即它出现无限次),所以它可以匹配多次。

与其将行视为以换行符结尾,不如将换行符视为行分隔符:

prog : row (NL row)* EOF;
row  : field (',' field)*;

未经测试,但应该可以正常工作。