2012-04-03 86 views
1

(我編輯基於@Bart煮布鍋的第一個評論我的問題 - 謝謝!)ANTLR的貪婪選項

我有以下的語法:

SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;}; 
START : 'START:'; 
STRING_LITERAL : ('"' .* '"')+; 
rule : START STRING_LITERAL; 

,我想分析像語言:'START:'abcd「START:」img src =「test.jpg」「'(字符串文字可以在字符串文字內)。
如果由於語言'START:'img src =「test.jpg」''詞法分析器將字符串翻譯爲以下標記,則字符串文字中存在字符串文字時,上述語法不起作用:START('START: ')STRING_LITERAL(「img src =」)test.jpg。
有沒有什麼辦法來定義一個適合我的問題的語法?

回答

0

有幾件事錯在這裏:

  • 不能使用的語法規則裏面fragment規則。你的語法永遠不會創建一個令牌;
  • 一個.炭(DOT-炭)解析器規則內匹配任何令牌,而詞法規則內時,它匹配任何字符;
  • 如果你讓.*匹配貪婪(和你已經定義了一個字符串匹配合適的詞法規則),輸入START: "abcd" START: "img src="test.jpg""將不得不在這一個大字符串:"abcd" START: "img src="test.jpg""(第一個和最後一個引號將匹配)。

因此,您不能使用相同的引號在字符串文字內嵌入字符串文字。詞法分析器無法確定引號是要關閉字符串還是它是(新)嵌入字符串的開始。你需要改變你的語法。

+0

謝謝!我將我的原始問題更新爲上面的問題。 Unfortuanaltey我不知道如何解決字符串文字問題中的字符串文字。我怎麼能改變語法? - 先謝謝你。 – user1286372 2012-04-04 09:07:05

+0

@ user1286372,我的觀點是你需要改變你的語法,以便在字符串內部不可能有字符串(至少,不是沒有轉義嵌套字符串)。換句話說:它不可能支持它。爲什麼不將外部引號定義爲單引號? – 2012-04-04 09:17:06

+0

是的,這將是一個可能的解決方案,但我希望沒有任何語言變化是可能的。但是非常感謝你!無法支持它的信息幫助了我! – user1286372 2012-04-04 10:15:24