2016-01-20 39 views
0

局势:antlr4规则没有忽略独立开括号

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

诀窍是字符串可以包含[而不反斜杠逃逸和]与backslasash逃逸,所以在这个例子:

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

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

PS:没有ANTLR有algorythm避免这种情况,是这样的:收集[在队列前,我们会发现第一]并使用队列的唯一负责人。但我真的需要antlr = _ =

回答

1

您可以使用Lexer模式。

词法模式允许我们将单个词法分析器语法拆分为多个 转租者。词法分析器只能返回符合 当前模式规则的标记。

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

首先,您需要将语法分为单独的lexerparser。在看到开放的括号后,只需使用另一种模式。

分析器语法:

parser grammar TestParser; 

options { tokenVocab=TestLexer; } 

rul : block+ ; 
block : LBR STRING RBR ; 

词法语法:

lexer grammar TestLexer; 

LBR: '[' -> pushMode(InString); 

mode InString; 

STRING : ([a-z] | '\\]' | '[')+ ; 
RBR: ']' -> popMode; 

工作实施例是here

你可以阅读关于词法分析模式的文档

+0

是的,它真的有用,谢谢!但是,你能详细解释它的工作原理吗?我的意思是,似乎甚至有重要的令牌和模式的定义顺序...所以如果我要扩展这个语法,我需要了解我在做什么=) – doubledeath

+0

我已经将文档的链接添加到答案中。是的,'mode ModeName'指令后声明的令牌与该模式相对应。 –