2013-08-16 64 views
1

我正在嘗試使用uu_parsinglib創建Monadic分析器。我原本以爲它涵蓋了,但我發現在測試Monadic分析與uu-parsinglib

一些意想不到的效果砍下例如我的解析器的是:

pType :: Parser ASTType 
pType = addLength 0 $ 
    do (Amb n_list) <- pName 
    let r_list = filter attributeFilter n_list 
    case r_list of 
     (ASTName_IdName a : []) -> return (ASTType a) 
     (ASTName_TypeName a : []) -> return (ASTType a) 
     _       -> pFail 
    where nameFilter :: ASTName' -> Bool 
      nameFilter a = 
       case a of 
       (ASTName_IDName _) -> True 
       (ASTName_TypeName _) -> True 
       _     -> False 

data ASTType = ASTType ASTName 

data ASTName = Amb [ASTName'] 

data ASTName' = 
    ASTName_IDName  ASTName 
    ASTName_TypeName ASTName 
    ASTName_OtherName ASTName 
    ASTName_Simple  String 

PNAME是一個模糊的解析器。我想要的類型解析器要應用後置過濾器,並返回滿足nameFilter的所有替代方法,並將其包裝爲ASTType。

如果沒有,則應該失敗。

(我知道我已經給了,如果沒有在列表中有多個有效的匹配會失敗的例子,但例如用於其目的)

現在,就我所看到的這一切工作。問題在於,當你在更復雜的語法中使用它時,似乎發生奇數匹配。什麼我嫌疑人是問題是addLength 0部分

我想要做的是分離出monadic和適用部分。使用篩選組件創建一個monadic解析器,然後使用< **>運算符應用pName。

或者

我會滿足於什麼addLength是做一個很好的解釋。

回答

1

我已經放在一起使用uu-parsinglib進行monadic解析的fudge /解決方法。我使用Monadic解析器的唯一方法是分析一個過分慷慨的初始解析器,並選擇性地失敗它的結果。

​​

重要的是要記住使用這個解析器的時候是

a -> M b 

必須消耗沒有輸入。它必須返回a的轉換版本,否則將失敗。

警告

測試上這僅僅是目前最小的,其行爲不被強制類型。這是一個軟糖。