2013-04-16 40 views
2

我想要一些語法來表示一個字符串,通過「和」內部串符號可以被引用如\」援引以下是我的語法:ANTLR的如何逃生報價符號引用字符串

fragment 
NUM_LETTER : ('a'..'z'|'A'..'Z'|'0'..'9'); 

STRING_LITERAL : '"' (NUM_LETTER|'_'|('\\"'))* '"'; 

但它不起作用,我嘗試在AntlrWorks1.5中解釋「\」a,它在STRING_LITERAL的生成語法樹中給出了一個MismatchedTokenException。我的語法哪部分是錯的?

回答

3

沒有什麼錯的語法。你可能會遇到這個錯誤,因爲你使用的是解釋器,這是錯誤的。改用ANTLRWorks的調試器。調試器會顯示輸入"\"a"被解析得很好(按CTRL + D開始調試)。

而且,你的字符串規則很可能是看起來像這樣更好:

STRING_LITERAL : '"' (~('"' | '\\' | '\r' | '\n') | '\\' ('"' | '\\'))* '"'; 

換句話說,你的字符串的內容是零個或多個:

  • 比任何一個其他字符引號,反斜線或換行符:~('"' | '\\' | '\r' | '\n')

  • 轉義引號和反斜線'\\' ('"' | '\\')
1

試試下面的表達式:

STRING : '"' (options{greedy=false;}:(~('\\'|'"') | ('\\' '"')))* '"'; 
+0

感謝奧賓。我在文法中加入了「(options {greedy = false;}」),但它的工作原理是什麼,但是antlr的貪婪匹配是如何導致我原始表達式失敗的? – Ryan

+0

我不知道,我的答案是他的複製粘貼你的谷歌搜索問題... – Aubin

+0

你可以刪除'選項{greedy = false;}:'部分。 –