WS : [ \t]+ -> skip ; // skip spaces, tabs
通过阻止这些字符到达解析器来很好地忽略空白。我想对“/”和换行符对进行同样的操作。也就是说,反斜杠换行符像其他空白一样被删除,允许单个语句嵌入换行符。
我正在尝试各种变体
ESC_NEWLINE : '\\'NEWLINE ; NEWLINE : '\r'? '\n'; WS : ([ \t]+ | ESC_NEWLINE) -> skip ;
但这不会跳过 ESC_NEWLINE。我不知道该采取什么其他方法。
当你这样做时:
ESC_NEWLINE : '\\' NEWLINE;
NEWLINE : '\r'? '\n';
WS : ([ \t]+ | ESC_NEWLINE) -> skip;
WS
规则永远不会匹配ESC_NEWLINE
。 Lexer 规则按以下方式匹配:
这意味着输入
\\n
(斜杠 + 新行)将始终作为 ESC_NEWLINE
规则进行匹配,而绝不会作为 WS
规则进行匹配。
解决方案:让
ESC_NEWLINE
跳过自身:
ESC_NEWLINE : '\\' '\r'? '\n' -> skip;
WS : [ \t]+ -> skip;