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