2017-06-21 88 views
0

我試圖實現一個解析器使用ANTLRv4語言,接受」「和\」作爲逃避「分隔字符串中的字符」。ANTLRv4:讀雙引號與和「

this question的答案顯示如何做「」轉義。然而,當我試圖把它擴大到也包括了\」的情況下,它幾乎作品,但是當兩個字符串在同一行變得過於貪婪

這裏是我的語法:

grammar strings; 
strings : STRING (',' STRING)* ; 

STRING 
: '"' (~[\r\n"] | '""' | '\"')* '"' 
; 

這裏是我的三個字符串輸入:

"This is ""my string\"", 
"cat","fish" 

這正確識別「這是‘’我的字符串\」」,但認爲‘貓’,‘魚’是所有一個字符串。 如果我將「魚」向下移動到下一行,它會正常工作。

任何人都可以弄清楚如何使它工作,如果「貓」和「魚」在同一行?

回答

0

讓您STRING規則不貪婪停在第一個引號字符遇到,而不是試圖讓儘可能多的:

STRING 
: '"' (~[\r\n"] | '""' | '\"')*? '"' 
; 
+0

這使得「貓」,「魚」部分正常工作,但完全打破了逃逸部分。 –

0

我發現我需要做的就是這按照我的意願工作,但說實話,我仍然不完全確定Antlr爲什麼要這樣做。

只需在'\"'子句中添加另一個反斜槓字符即可!

所以我最終STRINGS的定義是:'"' (~[\r\n"] | '""' | '\\"')* '"'

再回到第一的原則,我的手畫了一個問題的狀態轉換圖,然後意識到,這兩個逃逸機制序列是不一樣的,不能同樣對待。然後試圖在AntlrWorks中實現這兩種模式,顯然我需要添加第二個反斜槓,在這一點上它開始工作。

一個反斜槓後面跟着一些任意的字符是否僅僅表示字符?