跳过属于ANTLR4语法一部分的标记

跳过属于ANTLR4语法一部分的标记,antlr4,Antlr4,在ANTLR4中,这将导致跳过行_折叠标记: LINE_FOLD : CRLF WSP -> skip ; 但如果我这样做: ESCAPED_CHAR : '\\' LINE_FOLD? '\\' | '\\' LINE_FOLD? ';' | '\\' LINE_FOLD? ',' | '\\' LINE_FOLD? N ; 它会返回不带行折叠的转义字符吗?如果不是,我该怎么做?否,在转义字符内,CRLF WSP不会被跳过 ANTLR(4)最佳实践是在解析后的阶段(在侦

在ANTLR4中,这将导致跳过行_折叠标记:

LINE_FOLD
 : CRLF WSP -> skip
 ;
但如果我这样做:

ESCAPED_CHAR
 : '\\' LINE_FOLD? '\\'
 | '\\' LINE_FOLD? ';'
 | '\\' LINE_FOLD? ','
 | '\\' LINE_FOLD? N
 ;

它会返回不带行折叠的转义字符吗?如果不是,我该怎么做?

否,在
转义字符
内,
CRLF WSP
不会被
跳过

ANTLR(4)最佳实践是在解析后的阶段(在侦听器或访问者中)处理此类特定于目标的操作

但是,您可以在规则末尾添加一个特定于目标的块,该块从
转义字符
规则中丢弃
\\CRLF WSP

ESCAPED_CHAR
 : '\\' LINE_FOLD? [\\;,nN] 
   {
     String s = getText();
     setText(s.substring(s.length() - 1));
   }
 ;
假设您的lexer规则
N
'N'
'N'
匹配

现在规则
转义\u CHAR
将只生成内容位于以下位置的令牌:
\
n
n


也就是说,这只适用于Java目标。

因此,如果我想坚持使用ANTLR4最佳实践并将其放在侦听器中(正如我到目前为止对侦听器所做的那样),我将如何在上下文中找到转义字符并相应地调整它们?我有一个TextContext,其中包含各种各样的标记……恐怕除了使用目标语言的内置字符串方法AFAIK手动替换这些字符外,没有其他方法了。你可能想删减,看看是否有(或曾经)关于做这些事情的讨论。如果没有,你可以开始一个:)