我正在尝试将块之间的空行数限制为。
EOL:
'r'?
'n'
'r'?
'n'?
SPACE*
是否有一种方法将'n'和'rn'匹配为一个符号,如Perl 5中的'r '(换行)。或者完全忽略'r' ?
所有Lexer规则都产生一个"符号";(在ANTLR中它们被称为令牌)。
在Antlr中匹配EOL的典型方式是:
EOL: 'r?n';
这将匹配一个可选的回车,后跟换行符。
匹配rn
或n
将空格放在-> skip
指令或-> channel(HIDDNE)
指令的单独规则中是非常习惯的。
如果您试图合并行尾空白和多个空行,请尝试:
EOL: 'r'? 'n' (' '* 'r'? 'n')*;
这将为后面的空格和任何后续的空行及其结束符生成一个标记。
lexer语法示例:
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='nnnn',<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='nnnnnnnnn',<EOL>,6:2]
[@6,20:21='ZZ',<ALPHA>,15:0]
[@7,22:21='<EOF>',<EOF>,15:2]