2010-06-24 22 views
3

我試圖做一個解析器與快樂(Haskell工具)但我收到一個消息錯誤:「未使用的規則:11和未使用的終端:10」,我不知道這是什麼意思。另一方面,我真的不確定在規則聲明中使用$ i參數,我認爲我的錯誤是因爲這一點。如果有任何可以幫助我......解析器在快樂

回答

3

未使用的規則和終端是您的語法的一部分,如果我正確記得,它是無法從頂級語法分析語句達到的。要了解如何使用$$參數,請閱讀happy user guide

The $$ symbol is a placeholder that represents the value of this token. Normally the value of a token is the token itself, but by using the $$ symbol you can specify some component of the token object to be the value.

+0

但是,什麼意思是$ i參數?我正在閱讀用戶指南,但唯一的說法是$ i參數的'i'必須更短比生產右側的符號數量...但我看到了一些例子,我得到的是每個$ i符號都對應於一種對象或表達式 – Anny 2010-06-24 19:08:13

+0

所以你告訴我,當我編譯file.y,它顯示了一條未使用的規則消息,是否可以? – Anny 2010-06-24 19:10:10

4

這不是一個錯誤,如果你得到這些信息,它只是意味着你的語法的一部分是未使用的,因爲它不是從一開始就象徵到達。要查看有關幸福如何理解你的語法的更多信息,請使用--info標誌快樂:

happy --info MyParser.y 

產生另外一個文件MyParser.info平時MyParser.hs

+0

謝謝,我會試試:) – Anny 2010-06-27 17:47:34

1

未使用的規則和終端意味着您已經描述瞭解析過程中無法達到的規則(非常類似於「如果是true then 1 else 2」,則永遠不會到達2分支)。 檢查--info的輸出以獲取更多詳細信息。

對於$$的事情,它是一個數據提取:讓我們說你有一個產生以下類型的令牌 詞法分析:

data TokenType = INT | SYM 
data TokenLex = L TokenType String 

其中TokenType就是在這裏有用的區分數據和關鍵字。

在你的解析器的動作,你可以用$$

%token INTEGER {L INT $$ } 
%token OTHER  {L _ $$} 

foo : INTEGER bar INTEGER { read $1 + read $3 } 
    | ... 

在這個規則中提取字符串部分,$ 1表示「給我的第一個整數的內容」和$ 3「的內容第二個INTEGER「。 $ 2意味着「給我吧」的內容(這可能是另一個複雜的規則)

感謝$$,$ 1和$ 3是geniune Haskell字符串,因爲我們告訴Happy,「INTEGER的內容是」String「部分TokenLex「,而不是整個令牌