2014-07-20 70 views
0

我與列定義的語法ANTLR文件如下ANTLR - 字符串識別錯誤

STRING 
: '"' (EscapeSequence | ~('\\'|'"'))* '"' ; 
fragment EscapeSequence 
    : '\\' . 
; 

但這詞法規則忽略在引號的第一個實例轉義字符。該

ID \ = \」

是公認的開始字符串,而沒有前面的轉義字符。這只是第一個報價情況發生,所有的後續行情,如果逃跑,被正確識別

/ID \ = \ 「測試\」 - 不應被理解爲兩個引號轉義的字符串
/ID \ = 「測試」 - 應該是引號之間的字符串,因爲他們沒能逃過

主要解決的問題是避免試圖識別字符串詞法分析器如果字符(只報價前的最後一個字符是轉義字符。如果有多個轉義字符,我需要在開始引號之前考慮一個字符。

+0

您是否可以更新問題以包含所需字符串語法的詳細說明,以及正確和不正確字符串的示例? –

+0

更新了正面和負面測試用例的簡單示例 –

回答

0

ANTLR會在幾乎所有情況下自動提供您想要的行爲。考慮下面的輸入:

/id\=\"Testing\" 

的關鍵的要求涉及第一引號字符之前的令牌的位置和長度。在下面的塊中,我僅添加空格來說明字符之間出現的條件。

/ i d \ = \ " T e s t i n g \ " 
     ^
      | 
      ----------- Make sure no token can *end* here 

通過確保第一"字符包含的令牌還包括收到\性格的一部分,可以確保第一"字符將永遠不會被解釋爲STRING令牌的開始。

如果上述條件不符合,您的"字符視爲STRING令牌的開始。