2014-03-29 84 views
0

我想從快樂生成一個GLR解析器,但是一旦文件生成就會出錯。GLR_Lib.hs:找不到模塊'系統'

下面是一個例子,ABC.y,所以很顯然我試圖:

{ 
module Main where 
} 
%name ps1 s1 
%tokentype { ABC } 
%error { parseError } 
%token 
    a { A } 
    b { B } 
    c { C } 
%% 

s1: a a a b {} | b s2 a {} 
s2: b a b s2 {} | c {} 
{ 
data ABC = A | B | C 
parseError _ = error "bad" 
main = getContents >>= print . ps1 . lexer 
lexer ('a':xs) = A : lexer xs 
ETC 
} 

這個例子的工作方式與

happy ABC.y 

但是細末,用--glr happy'd ,我無法建立結果。我想知道我是否做錯了。準確地說,happy --glr產生了兩個輸出ABC.hs.但是,ABCData.hs

ghc --make ABC.hs ABCData.hs 

現在失敗。我得到的錯誤是找不到模塊'系統',它是haskell-98的一個隱藏成員...我嘗試添加包haskell98,並得到模糊的前奏問題。我也嘗試將語法編碼爲BNFC並使用它們的-glr選項,但是我仍然遇到其他錯誤,例如依賴Data.FiniteMap,這顯然已被棄用。有沒有辦法讓這個編譯?

+0

我想添加一條評論。我自動生成.y文件,我很樂意使用任何glr解析器 - 即使代碼gen不會導致Haskell代碼。所以如果有人可以推薦一個好的glr解析器;如果野牛glr方法完整並且發展良好,我可以輕鬆切換到該方法。 –

回答

1
happy --glr 

工作正常 - 有一件事必須在輸出手動更改。但請注意,它與使用典型的_ .y文件中的Happy不同。

基本上,你必須考慮一些差異。預期詞法分析器結果的類型不同。解析器的返回類型不易控制且不同。而你使用解析器的方式稍有不同。必要的信息可以在以下網址找到: http://www.haskell.org/happy/doc/html/sec-glr-using.html 並且瞭解該網頁以正確使用glr選項非常重要。

以下是您可以如何使用Happy與glr選項來生成獨立解析器;我們所關心的只是解析是否成功 - 您可以在上面的頁面中閱讀更多關於解析結果以及如何解釋它們的內容。我們將爲上面的解析器ABC做這件事。首先,創建一個名爲ABCMain.hs:

module Main where 

import ABC 
import ABCData 

main = do 
    inp <- getContents 
    case happyParse (lexer inp) of 
     ParseOK _ _ -> putStrLn "success" 
     _ -> putStrLn " success" 
lexer ('a':xs) = [A] : lexer xs 
ETC -- note that it is [[Token]] instead of [Token] 

而且ABC.y文件很簡單:

%tokentype { ABC } 
%error { parseError } 
%token 
    a { A } 
    b { B } 
    c { C } 
%% 
s1 : a a a b {} | b s2 a {} 
s2: b a b s2 {} | c {} 
{ 
data ABC = A | B | C deriving (Eq,Ord,Show) -- you must have Eq and Ord 
parseError _ = error "bad" 
} 

運行

happy --glr ABC.y 

產生兩個文件。現在,有一點我會愛一個人要評論 - 本質上,你必須手動更改,在生成的文件ABC.hs,行

import System 

import System.IO 

然後,以下作品適用於我:

ghc --make ABCMain.hs 

所有編譯和解析器都按預期工作。隨時讓我知道,如果我做得對。