一元解析与uu-parsinglib

一元解析与uu-parsinglib,parsing,haskell,monads,uu-parsinglib,Parsing,Haskell,Monads,Uu Parsinglib,我正在尝试使用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 : []

我正在尝试使用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
pType::解析器类型
pType=addLength 0$
do(Amb n_列表)返回(ASTType a)
(ASTName_类型名称a:[])->返回(ASTType a)
_->pFail
其中nameFilter::ASTName'->Bool
名称过滤器a=
案例a
(ASTName\u IDName)->True
(ASTName\u TypeName)->True
_->错误
数据ASTType=ASTType ASTName
数据ASTName=Amb[ASTName']
数据名称'=
ASTName\u id名称ASTName
ASTName\u类型名称ASTName
ASTName\u其他名称ASTName
ASTName\u简单字符串
pName是一个不明确的解析器。我想让类型解析器做的是应用一个post过滤器,并返回所有满足nameFilter的替代项,包装为ASTType

如果没有,它应该失败

(我意识到如果列表中有多个有效匹配项,我给出的示例将失败,但该示例符合其目的)

就我所知,这一切都是可行的。问题在于当你在更复杂的语法中使用它时,会出现奇怪的匹配。我怀疑问题出在addLength 0部分

我想做的是把一元和应用部分分开。使用筛选组件创建一个单元解析器,然后使用运算符应用pName

或者


对于addLength所做的工作,我愿意接受一个非常好的解释。

我已经准备好了一个用于uu parsinglib的一元解析的变通方法。我使用一元解析器的唯一方法是分析一个过于慷慨的初始解析器,并有选择地使其结果失败

bind' :: Parser a -> (a -> Parser b) -> Parser b
bind' a@(P _ _ _ l') b = let (P t nep e _) = (a >>= b) in P t nep e l'
使用此解析器时要记住的重要一点是

a -> M b
不能使用任何输入。它必须返回的转换版本,否则将失败

警告


目前,对它的测试非常少,并且它的行为并没有按类型强制执行。这是一个模棱两可的东西。

我已经准备了一个模棱两可的解决方案,用于uu parsinglib的一元语法分析。我使用一元解析器的唯一方法是分析一个过于慷慨的初始解析器,并有选择地使其结果失败

bind' :: Parser a -> (a -> Parser b) -> Parser b
bind' a@(P _ _ _ l') b = let (P t nep e _) = (a >>= b) in P t nep e l'
使用此解析器时要记住的重要一点是

a -> M b
不能使用任何输入。它必须返回的转换版本,否则将失败

警告

目前,对它的测试非常少,并且它的行为并没有按类型强制执行。这是一种软糖