ANTLR:根据上下文跳过换行符而不使用操作

ANTLR: Skipping NewLine depending on context without using actions

我尝试为一个数据制作一个 ANTLR 语法,其中包含一个我可以跳过 NewLine 的部分,以及一个可能很重要的部分。更具体地说,我对跳过括号内的 NewLine 感兴趣,并希望使用词法分析器模式来实现这一点。但是有一个问题:在DEFAULT_MODE中有很多词法分析器规则,这些规则中描述的标记可以出现在里面 括号也是。我该如何解决这个问题?

也许我的代码的当前状态将有助于理解问题

// ...

LPAREN : '(' -> pushMode(InsideParen) ;

// ...

mode InsideParen ;
InsideParenNewLine : ('\r'? '\n') -> skip ;

// here I want somehow recognize all tokens from DEFAULT_MODE without rewriting all rules

RPAREN: ')' -> popMode ;

提前致谢。

一看到这个问题,我就认为你的问题类似于 Python 换行处理。但后来我注意到你正在使用 pushMode,它不是 ANTLR4 构造...

但是,如果您愿意升级到 ANTLR4,则可以利用以下内容:

LINENDING:             (('\r'? '\n')+ {self._lineContinuation=False}
    |      '\'  [ \t]* ('\r'? '\n')  {self._lineContinuation=True})
{
if self._openBRCount == 0 and not self._lineContinuation:
    if not self._suppressNewlines:
        self.emitNewline()
        self._suppressNewlines = True
    la = self._input.LA(1)
    if la not in [ord(' '), ord('\t'), ord('#')]:
        self._suppressNewlines = False
        self.emitFullDedent()
} -> channel(HIDDEN)
   ;

OPEN_PAREN:     '(' {self._openBRCount  += 1};
CLOSE_PAREN:    ')' {self._openBRCount  -= 1};
OPEN_BRACE:     '{' {self._openBRCount  += 1};
CLOSE_BRACE:    '}' {self._openBRCount  -= 1};
OPEN_BRACKET:   '[' {self._openBRCount  += 1};
CLOSE_BRACKET:  ']' {self._openBRCount  -= 1};

UNKNOWN: . -> skip;

这将使您的语法在空格方面表现得像 Python,并且可能会在您对括号而不是行继续字符进行操作时进行一些调整。参见 this python grammar