我正试图解析标志的排列。我想要的行为是“任何顺序的一个或多个标志,不重复”。我使用以下软件包:
我的代码输出了我想要的东西,但是对输入太宽松了。我不明白它为什么要接受同一旗帜的倍数。我在这里做错什么了?
pFlags :: Parser [Flag]
pFlags = runPermutation $ f <$>
toPermutation (optional (GroupFlag <$ char '\'')) <*>
toPermutation (optional (LeftJustifyFlag <$ char '-'))
where f a b = catMaybes [a, b]示例:
"'-" = [GroupFlag, LeftJustifyFlag] -- CORRECT
"-'" = [LeftJustifyFlag, GroupFlag] -- CORRECT
"''''-" = [GroupFlag, LeftJustifyFlag] -- INCORRECT, should fail if there's more than one of the same flag.发布于 2021-12-18 20:00:16
与toPermutation与optional不同,我认为您需要使用toPermutationWithDefault,如下所示(未经测试):
toPermutationWithDefault Nothing (Just GroupFlag <$ char '\'')在第4编“添加可选元素”(emph )中,“解析置换短语”(PDF格式)一文描述了这一推理。增加):
考虑一下,例如…a,b和c的所有排列。假设b可以是空的,我们想识别ac。这可以通过三种不同的方式来完成,因为空b可以在a之前、a之后或c之后被识别。幸运的是,它与解析结果无关,因为空b是从哪里导出的,因为顺序并不重要。这允许我们使用与Cameron提出的策略类似的策略:在看到非空成分时解析它们,如果所有剩余元素都是可选的,则允许解析器停止。当解析器停止时,将返回所有未识别的可选元素的默认值。 要实现此策略,我们需要能够确定解析器是否可以派生空字符串并将其拆分为默认值和非空部分,即行为相同的解析器,除非它不识别空字符串。
也就是说,置换解析器需要知道哪些元素可以在不消耗输入的情况下成功,否则它将太急于提交到分支。我不知道为什么这会导致接受一个元素的倍数;也许您也缺少了一个eof
https://stackoverflow.com/questions/70399808
复制相似问题