首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用megaparsec +解析器-组合器进行置换分析过于宽松

用megaparsec +解析器-组合器进行置换分析过于宽松
EN

Stack Overflow用户
提问于 2021-12-17 23:23:18
回答 1查看 102关注 0票数 2

我正试图解析标志的排列。我想要的行为是“任何顺序的一个或多个标志,不重复”。我使用以下软件包:

  • 兆赫秒
  • 解析器-组合器

我的代码输出了我想要的东西,但是对输入太宽松了。我不明白它为什么要接受同一旗帜的倍数。我在这里做错什么了?

代码语言:javascript
复制
pFlags :: Parser [Flag]
pFlags = runPermutation $ f <$> 
    toPermutation (optional (GroupFlag <$ char '\'')) <*> 
    toPermutation (optional (LeftJustifyFlag <$ char '-'))
    where f a b = catMaybes [a, b]

示例:

代码语言:javascript
复制
"'-" = [GroupFlag, LeftJustifyFlag] -- CORRECT
"-'" = [LeftJustifyFlag, GroupFlag] -- CORRECT
"''''-" = [GroupFlag, LeftJustifyFlag] -- INCORRECT, should fail if there's more than one of the same flag.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-18 20:00:16

toPermutationoptional不同,我认为您需要使用toPermutationWithDefault,如下所示(未经测试):

代码语言:javascript
复制
toPermutationWithDefault Nothing (Just GroupFlag <$ char '\'')

在第4编“添加可选元素”(emph )中,“解析置换短语”(PDF格式)一文描述了这一推理。增加):

考虑一下,例如…a,b和c的所有排列。假设b可以是空的,我们想识别ac。这可以通过三种不同的方式来完成,因为空b可以在a之前、a之后或c之后被识别。幸运的是,它与解析结果无关,因为空b是从哪里导出的,因为顺序并不重要。这允许我们使用与Cameron提出的策略类似的策略:在看到非空成分时解析它们,如果所有剩余元素都是可选的,则允许解析器停止。当解析器停止时,将返回所有未识别的可选元素的默认值。 要实现此策略,我们需要能够确定解析器是否可以派生空字符串并将其拆分为默认值和非空部分,即行为相同的解析器,除非它不识别空字符串。

也就是说,置换解析器需要知道哪些元素可以在不消耗输入的情况下成功,否则它将太急于提交到分支。我不知道为什么这会导致接受一个元素的倍数;也许您也缺少了一个eof

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

https://stackoverflow.com/questions/70399808

复制
相关文章

相似问题

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