Monadic分析与uu-parsinglib
问题描述:
我正在尝试使用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是做一个很好的解释。
答
我已经放在一起使用uu-parsinglib进行monadic解析的fudge /解决方法。我使用Monadic解析器的唯一方法是分析一个过分慷慨的初始解析器,并选择性地失败它的结果。
重要的是要记住使用这个解析器的时候是
a -> M b
必须消耗没有输入。它必须返回a的转换版本,否则将失败。
警告
测试上这仅仅是目前最小的,其行为不被强制类型。这是一个软糖。