2013-03-08 18 views
0

以下是一些代碼,它會導致一些非常奇怪的錯誤,具體取決於在目標文件中的標記emptyList之後解析了什麼 。當使用parsec時Emptylist問題

data Express = Seq [Express] 
       | ID String 
       | Num Integer 
       | BoolConst Bool 
       | EmptyList String 

emptyList :: Parser Express 
emptyList = fmap EmptyList (string "[]") 

的問題是:

當「[]」之後是任何東西(包括空格)除數字或文件的末尾以外的字符串時,它導致以下錯誤

(line 1, column 6): 
unexpected end of input OR unexpected "d" 
expecting digit 
*** Exception: user error (parse error) 

但是,當用[]後面的數字解析時,它報告沒有錯誤。

e.g. "[] " error 
    "[] a" error 
    "[] 1" successful 

而且應該在民整數來的文件

number :: Parser Express 
number = fmap Num integer 

該文件將經過「[]」,然而解析將返回解析精而不任何從數據定義中刪除和其他地方只,直到第一次出現「[]」,之後什麼也沒有

在此先感謝。

+1

我們需要查看更多的代碼。如何使用'emptyList'?它使用的其他解析器是什麼? – dave4420 2013-03-08 12:37:40

+1

您應該發佈解析器代碼的其餘部分。我認爲這個問題不在你到目前爲止包含的內容中。 – shang 2013-03-08 12:37:52

+2

問題在於調用'emptyList'的解析器。顯然,它假設它後面緊跟着'eof'或''''。發佈解析器,以便我們可以診斷錯誤。 – 2013-03-08 13:15:59

回答

0

問題來自於表達式被分隔的方式,當處理多個表達式時,whiteSpace沒有被正確解釋。 最初:

seqOfExpr8 =   
    do list <- (sepBy1 expr8 (string "")) 
     return $ if length list == 1 then head list else Seq list  

固定:

seqOfExpr8 =   
    do list <- (sepBy1 expr8 whiteSpace) 
     return $ if length list == 1 then head list else Seq list  

這裏的空白是從genTokenParser類型一語義解析器。