2017-01-03 40 views
0

我有一個簡單的語法像這樣了Java Antlr4貪含STRING_LITERAL 「?

"STRING_LITERAL"(, "STRING_LITERAL")? 

在lexer.g4,我定義STRING_LITERAL這樣

STRING_LITERAL: '"'[a-zA-Z0-9!#$&.+-^_{}:\\\" ]+'"'; 

然而,似乎它將忽略2個單詞之間的逗號(「,」),就像本輸入測試一樣:「abc」,「」cde \「」 Anltr4會將這兩個STRING_LITERAL讀取爲1個文本而不是2個文本

List<TerminalNode> params = ctx.STRING_LITERAL(); // Only have 1 String element ("abc", "\"cde\"") 

如何在STRING_LIERAL中使用帶有\「的antr4並用逗號(,)分割它,那麼params將包含2個元素(」abc「和」\「cde \」「)?

回答

1

我用'"' ('\\"'|.)*? '"'作爲我的字符串的詞法規則,然後一個PARAMS定義中使用:

actionExpressions 
    : exp += expression (COMMA exp += expression)* 
    ; 

expression也能像整數,布爾,字符串,標識等任何東西。您不應該嘗試將分割整合到STRING字面定義中。一個字符串只是一個字符序列。

在我的詞法分析規則中,是「處理」非貪婪。