2017-08-02 66 views
0

我正在使用ANTLR 4.7。ANTLR4:是否可以匹配一段不跟隨令牌的內容?

輸入如下:

[section a] 
bla bla bla 

[section b] <<<<<<< to ignore 
bla bla bla <<<<<<< to ignore 

[section c] 
bla bla bla 

如何igonre在[section b]的全部內容?

目前,我使用的是詞法規則如下圖所示:

Section_Igonre : '[section b]' (~'[')* ->skip; 

我使用[作爲下一章節開始的一個指標。所以忽略應該停止在那裏。

但是,如果b部分內容包含[,恐怕不是那麼可靠。所以我想先使用一個標記來匹配節標記。然後使用該標記作爲停止忽略的指標。

SectionTag : '[' [a-zA-Z]+ ']'; 

這可能嗎?下面我嘗試,但ANTLR拒絕了:

Section_Igonre : '[section b]' (~SectionTag)* ->skip; 

錯誤說:

嚴重性: '錯誤' 的消息: '規則參考SectionTag目前不 一組支持'

回答

0

成功解析後,這在您的Visitor或Listener類中最爲方便。這很像問題answered here by another high-reputation ANTLR expert

我只是讓它解析,然後創建一個空的Listener或Visitor覆蓋,與您提到的部分完全沒有關係。

+0

的問題是,我只是想找到一種方式來跳過任意章節給出的部分名稱。所以我不需要弄清楚他們每個人的語法。有這麼多,每個部分是如此不同。如果我可以跳過它們,我可以節省內存佔用。 – smwikipedia

+1

也許預處理您的輸入並移除您不感興趣的所有內容(假設您有一對易於查找的獨特分隔符)。然後將此過濾過程的結果提供給解析器。 –

+0

@MikeLischke謝謝。 Thant是一種選擇。如果我沒有其他選擇。我會嘗試。 – smwikipedia

0

首先,在Section_ Igonre中似乎存在拼寫錯誤,這可能是您的整個問題!不管怎樣,試試這個,HTH。

​​

我用下面的數據

[section a] 
first bla bla bla 
two line section 

[section b] 
bla bla bla <<<<<<< to ignore this section 

[section c] 
second bla bla bla 

[section b] 
repeated bla bla bla <<<<<<< to ignore this section 

grun輸出測試它是

$ grun ini prog -tree -tokens data 
got a sectiontag ! 
got BODYTEXT! 
got an ignored sectiontag ! 
got a sectiontag ! 
got BODYTEXT! 
got an ignored sectiontag ! 
[@0,0:11='[section a]\n',<SectionTag>,1:0] 
[@1,12:47='first bla bla bla\ntwo line section\n\n',<BODYTEXT>,2:0] 
[@2,104:115='[section c]\n',<SectionTag>,8:0] 
[@3,116:135='second bla bla bla\n\n',<BODYTEXT>,9:0] 
[@4,201:200='<EOF>',<EOF>,14:0] 
(prog 
(section [section a]\n first bla bla bla\ntwo line section\n\n) 
(section [section c]\n second bla bla bla\n\n) 
<EOF>) 
$