我正在嘗試使用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是做一個很好的解釋。