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