antlr4规则不忽略独立的开放式括号

时间:2016-01-20 16:34:17

标签: java antlr antlr4

情况:

rule   : block+ ;
block  : '[' String ']' ;
String : ([a-z] | '[' | '\\]')+ ;

Trick 字符串可以包含 [没有反斜杠转义和] 并使用backslasash转义,所以在此示例中:

[hello\]world][hello[[world]

第一个块可以正确解析,但第二个...解析器正在为每个 [>尝试查找] 。有没有办法说antlr解析器忽略这个独立的 [?我无法更改格式,但我需要找到一些使用antlr的解决方法。

PS:如果没有antlr,可以采用algorythm来避免这种情况,比如:在我们找到第一个] 之前收集 [在队列中“并仅使用队列头部。但我真的需要antlr = _ =

1 个答案:

答案 0 :(得分:1)

您可以使用Lexer模式。

  

词法模式允许我们将单个词法分析器语法分成多个   sublexers。词法分析器只能返回与规则匹配的标记   目前的模式。

您可以在antlr文档here中阅读有关词法分析器规则的更多信息。

首先,您需要将语法划分为单独的lexerparser。而不是在看到开括号后再使用其他模式。

解析器语法:

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

您可以阅读有关词法分析器模式的文档