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

Parsing ANTLR:根据上下文跳过换行,而不使用操作,parsing,antlr,Parsing,Antlr,我尝试为一个数据创建一个ANTLR语法,其中包含一个可以跳过换行的部分,以及一个可能很重要的部分。更具体地说,我感兴趣的是跳过括号内的换行符,并希望使用lexer模式实现这一点。但是有一个问题:在DEFAULT\u模式下有很多lexer规则,这些规则中描述的标记可以出现在内部 括号也是。我怎样才能解决这个问题 也许我的代码的当前状态将有助于理解这个问题 // ... LPAREN : '(' -> pushMode(InsideParen) ; // ... mode InsideP

我尝试为一个数据创建一个ANTLR语法,其中包含一个可以跳过
换行的部分,以及一个可能很重要的部分。更具体地说,我感兴趣的是跳过括号内的
换行符
,并希望使用lexer模式实现这一点。但是有一个问题:在
DEFAULT\u模式下
有很多lexer规则,这些规则中描述的标记可以出现在内部 括号也是。我怎样才能解决这个问题

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

// ...

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一样,并且可能会对括号而不是行继续字符进行一些调整。请参阅。

这是ANTLR3吗?或者你想在ANTLR4中执行这些操作?@JLH是AntlR3我是ANTLR4的人。但是,您所讨论的行为与Python处理空白的方式类似。建议您寻找ANTL3 Python语法,并从中获得一些提示。一定有一个。祝你好运@JLH感谢您的回复!我现在就去看看。@JLH我得问问。在ANTLR4中如何解决这个问题?