2016-12-04 55 views
0

我已經開始編寫自己的詞法分析器,並且由於它們具有與它們相關聯的開始(「)和結束(」)字符而導致令牌化字符串出現問題。Lexer:在標記時處理未終止的字符串

有沒有人知道一個常見的技術,一個詞法分析器可以應付並繼續lexing與一個未終止的字符串? 我認爲ANTLR可以做到這一點,這是由ANTLR的ATN處理?

我可以看到有是兩個問題在這裏假設字符串必須終止在同一行:

  1. 字符串終止發生在一個單獨的行 - 因此警告說,串只能在一個單一的放在用戶線。
  2. 字符串終止不會發生,那麼您什麼時候知道要繼續的有效點是?在新行後使用下一個有效標記的啓發式。

char *mystring = "my string which is unterminated.... 
int id = 20; 

回答

1

如果你的語言禁止換行符字符串常量,那麼就終止在該行的結束的字符串是容易被接受的。在字符串文字的同一行上會出現聲明或關鍵字聲明是不太可能的(並且沒有理由通過嘗試補償它來鼓勵不良風格)。

您可能會跳過一個有用的右括號:

printf("%s\n, line); 

但是你可能有恢復規則,可以解決這個問題。

如果字符串文字可以包含換行符 - 並且有足夠的證據表明這個特性通常是需要的 - 那麼恢復就相當困難了,您可能會發現最簡單的解決方案就是拋出語法錯誤明確指出違規字符串的起始位置。

+0

我在另一個答案的地方讀到,錯誤處理要比解析器而不是詞法分析器好得多。你對此有何看法,以及如何通過它,因爲這裏沒有標記...... – Har

+1

@har:肯定有一個集中處理錯誤的說法,但是詞法錯誤總是會在掃描器中被檢測到。我通常只是調用'yyerror'來報告錯誤;在不好的情況下(同樣適用於不好的數字),通常沒有其他需要做的事情。當然,你可以返回一個「不好的字面量」標記,然後在解析器中產生一個錯誤信息,並生成一個單元,將'BAD_LITERAL'變成一個'value'(或者任何非終端的base)錯誤。 – rici