Monadic分析与uu-parsinglib

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的转换版本,否则将失败。

警告

测试上这仅仅是目前最小的,其行为不被强制类型。这是一个软糖。