情况:
rule : block+ ;
block : '[' String ']' ;
String : ([a-z] | '[' | '\\]')+ ;
Trick 字符串可以包含 [没有反斜杠转义和] 并使用backslasash转义,所以在此示例中:
[hello\]world][hello[[world]
第一个块可以正确解析,但第二个...解析器正在为每个 [>尝试查找] 。有没有办法说antlr解析器忽略这个独立的 [?我无法更改格式,但我需要找到一些使用antlr的解决方法。
PS:如果没有antlr,可以采用algorythm来避免这种情况,比如:在我们找到第一个] 之前收集 [在队列中“并仅使用队列头部。但我真的需要antlr = _ =答案 0 :(得分:1)
您可以使用Lexer模式。
词法模式允许我们将单个词法分析器语法分成多个 sublexers。词法分析器只能返回与规则匹配的标记 目前的模式。
您可以在antlr文档here中阅读有关词法分析器规则的更多信息。
首先,您需要将语法划分为单独的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;
工作示例是here。
您可以阅读有关词法分析器模式的文档