我尝试为数据创建一个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 ;
提前谢谢。
答案 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。