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]
我正在尝试将块之间的空行数限制为 .
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]