Antlr4:匹配'\r\n'和'\n'作为一个符号

Antrl4: Matching '\r\n' and '\n' as one symbol

我正在尝试将块之间的空行数限制为 .

EOL:
   '\r'?
   '\n'
   '\r'? 
   '\n'?
   SPACE*

有没有办法将 '\n' 和 '\r\n' 作为一个符号来匹配,就像 Perl 5 中的 '\R'(换行符)一样。 或者完全忽略'\r'?

所有 Lexer 规则都会产生一个“符号”(在 ANTLR 中,它们被称为标记)。

在 Antlr 中匹配 EOL 的典型方式如下:

EOL: '\r?\n';

这将匹配一个可选的回车 return 后跟一个换行符。

这将匹配 \r\n\n

通常使用 -> skip 指令或 -> channel(HIDDNE) 指令将空格放入单独的规则中。

如果您尝试合并行尾空格和多个空行,请尝试:

EOL:   '\r'? '\n' (' '* '\r'? '\n')*;

这将为尾随空格和任何后续空行及其行终止符生成一个标记。

词法分析器语法示例:

lexer grammar eol
    ;

ALPHA: [A-Za-z]+;
EOL:   '\r'? '\n' (' '* '\r'? '\n')*;

示例输入文件:

ANB



G
KL








ZZ
➜ grun eol tokens -tokens < eol.txt
[@0,0:2='ANB',<ALPHA>,1:0]
[@1,3:6='\n\n\n\n',<EOL>,1:3]
[@2,7:7='G',<ALPHA>,5:0]
[@3,8:8='\n',<EOL>,5:1]
[@4,9:10='KL',<ALPHA>,6:0]
[@5,11:19='\n\n\n\n\n\n\n\n\n',<EOL>,6:2]
[@6,20:21='ZZ',<ALPHA>,15:0]
[@7,22:21='<EOF>',<EOF>,15:2]