antlr4语法 - 如何匹配EOF / NL

时间:2016-12-20 21:44:51

标签: antlr4

如何匹配最后一行没有换行符的文件 结束。当我使用注释行(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>

1 个答案:

答案 0 :(得分:2)

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

  • field可以匹配空字符串
  • 由于(',' field)*量词,
  • *显然可以匹配空字符串
  • EOF令牌无法消耗(即它无限次出现),因此可以多次匹配。

不要将行视为以换行符结尾,为什么不将换行符视为行分隔符:

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

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