在ANTLR4中,这将导致跳过LINE_FOLD令牌:
LINE_FOLD
: CRLF WSP -> skip
;
但如果我这样做:
ESCAPED_CHAR
: '\' LINE_FOLD? '\'
| '\' LINE_FOLD? ';'
| '\' LINE_FOLD? ','
| '\' LINE_FOLD? N
;
它会在没有LINE_FOLD的情况下返回ESCAPED_CHAR吗?如果没有,我该怎么做?
否,在ESCAPED_CHAR
内部,CRLF WSP
将不会被skip
处理。
ANTLR(4)最佳实践是在解析后的阶段(在侦听器或访问者中)处理此类特定于目标的操作。
但是,可以在从ESCAPED_CHAR
规则中丢弃\ CRLF WSP
的规则末尾添加特定于目标的块:
ESCAPED_CHAR
: '\' LINE_FOLD? [\;,nN]
{
String s = getText();
setText(s.substring(s.length() - 1));
}
;
假设lexer规则N
匹配'n'
或'N'
。
现在,规则ESCAPED_CHAR
将只生成内容为以下内容的令牌:\
、;
、,
、n
或N
。
需要说明的是,这只适用于Java目标。