ANTLR:根据上下文跳过NewLine而不使用操作

时间:2017-07-25 07:34:19

标签: parsing antlr

我尝试为数据创建一个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 ;

提前谢谢。

1 个答案:

答案 0 :(得分:1)

当我看到这个问题时,我认为你的问题与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