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。
我尝试为一个数据制作一个 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。