[英]antlr4 rule not ignoring standalone open bracket
情况:
rule : block+ ;
block : '[' String ']' ;
String : ([a-z] | '[' | '\\]')+ ;
Trick is String可以包含[不带反斜杠转义,以及带反斜杠转义的] ,因此在此示例中:
[hello\]world][hello[[world]
可以正确解析第一个块,但是第二个...解析器正在尝试为每个[查找] 。 有没有办法说antlr解析器忽略此独立[[ ? 我无法更改格式,但是我需要找到与antlr相关的解决方法。
PS:如果没有antlr,则有算法可以避免这种情况,例如:在队列中收集[在我们找到第一个队列之前]并仅使用队列头。 但是我真的需要antlr = _ =
您可以使用Lexer模式。
词法模式使我们可以将单个词法分析器语法拆分为多个子词法分析器。 词法分析器只能返回当前模式下与规则匹配的标记。
你可以阅读更多关于词法规则ANTLR文档中的位置 。
首先,您需要将语法划分为单独的lexer
和parser
。 看到打开的括号后,不只是使用其他模式。
解析器语法:
parser grammar TestParser;
options { tokenVocab=TestLexer; }
rul : block+ ;
block : LBR STRING RBR ;
Lexer语法:
lexer grammar TestLexer;
LBR: '[' -> pushMode(InString);
mode InString;
STRING : ([a-z] | '\\]' | '[')+ ;
RBR: ']' -> popMode;
工作示例在这里 。
您可以阅读有关lexer模式的文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.