2016-01-20 32 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'指令後聲明的令牌與該模式相對應。 –