首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有uu-parsinglib的一元解析

带有uu-parsinglib的一元解析
EN

Stack Overflow用户
提问于 2013-08-16 08:55:36
回答 1查看 226关注 0票数 1

我正在尝试使用uu_parsinglib创建一个一元解析器。我以为我已经搞定了,但我在测试中得到了一些意想不到的结果

我的解析器的一个简化示例是:

代码语言:javascript
复制
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是一个不明确的解析器。我想要类型解析器做的是应用post过滤器,并返回所有满足nameFilter的选项,包装为ASTType。

如果没有,就应该失败。

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

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

我想要做的是分离出一元和应用部分。使用过滤组件创建一个一元解析器,然后使用pName操作符应用<**>。

交替

我满足于对addLength正在做的事情做一个很好的解释。

EN

回答 1

Stack Overflow用户

发布于 2013-08-17 20:34:36

我已经为提供了一个用于一元解析的模糊/变通方法。我使用Monadic解析器的唯一方法是分析一个过于慷慨的初始解析器,并有选择地失败其结果。

代码语言:javascript
复制
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'

在使用此解析器时,要记住的重要一点是

代码语言:javascript
复制
a -> M b

必须不消耗任何输入。它必须返回转换后的版本,否则失败。

警告

目前这方面的测试非常少,而且它的行为不是按类型强制执行的。这是个软糖。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18269480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档