1

我正在爲編譯器設計課程編寫一個編譯器,我正在編寫一個語法分析,我需要編寫一個解析器。如何在編譯器內對FIRST&FOLLOW集進行編碼

我需要有FIRST和FOLLOW集來處理可能出現在源文本中的任何錯誤。我已經爲我的語法中的所有非終端預先計算了FIRST和FOLLOW集,但是我無法確定我應該在哪裏將它們實際編碼到我的程序中。

我應該把它們放在一個映射中,其中的鍵是非終端的名稱嗎?

任何意見將是有益的

這篇文章看起來可能有點不清楚,如果需要,我可以澄清任何點。

回答

2

如果你想保留它們,你想把它們附加到它們所代表的非終結符。您可能還想要反轉,例如,來自集合成員的映射返回到它們是FIRST或FOLLOW的非終止符。

然後,您錯誤恢復例程可以使用以前或更可能的「下一個」輸入標記(這是導致您報告錯誤的那個標記)來決定可以插入到輸入流中的內容。

我實際上沒有存儲這些。我使用一個GLR解析器,其解析表本質上是LALR解析表,並且簡單地構建一個遞歸算法來遍歷這些表,以查看哪些標記可能允許解析器繼續。間接地,我利用FIRST和FOLLOW,因爲那些被用來構造分析表。

如果您正在進行編譯器設計課程,建議重點關注解析後問題。你可以花費大量的時間來試圖「修補」源代碼來應對錯誤,而你所學到的只是a)這很難,b)沒有人會特別喜歡你提供的選擇。你可以在修復語法上花費精力,直到你臉色發青,但我會等到有人讓你去找工作。同時,對於編譯器類,我會讓編譯器簡單地說:「N行的語法錯誤」並中止。 不錯,但足以讓你繼續更有趣的部分。

+0

在處理語法錯誤時,我還想停止遇到的第一個遇到的錯誤,因爲顯然用戶需要在編譯成功之前修復該錯誤;但是這個項目的一個要求是,我必須在向用戶報告之前收集所有的語法錯誤。 – 2012-03-17 21:11:58

+0

你能解釋更多關於反演嗎?這基本上是一個從所有終端符號映射到一個非終端X的映射嗎?也感謝您的回覆,這非常有幫助。 – 2012-03-17 21:14:08

+1

@Hunter:「收集所有語法錯誤?」這有點含糊,因爲一旦你修補了你的輸入,解析器就可以繼續了,你已經猜到了程序員的實際意圖,猜測是不對的。通常,一旦解析器繼續運行,它將遇到另一個(「級聯」)語法錯誤......是用戶所做的還是由錯誤恢復引起的錯誤?一個便宜的技巧:如果輸入令牌不可接受,請報告語法錯誤,刪除它並繼續前進(您可能會抑制在同一地點發生的其他語法錯誤)。 ... – 2012-03-17 21:16:32