如何从秒差距中的可选解析器检索值?

发布于 2024-09-27 09:28:35 字数 559 浏览 0 评论 0原文

抱歉,如果这是一个新手问题 - 我想解析由

Exp ::= Mandatory_Part Optional_Part0 Optional_Part1

认为定义的内容我可以这样做:

proc::Parser String

proc = do {

    ;str<-parserMandatoryPart

    ;str0<-optional(parserOptionalPart0)  --(1)

    ;str1<-optional(parserOptionalPart1)  --(2)

    ;return str++str0++str1

}

如果存在可选部分,我想获取 str0/str1,否则,str0/str1 将是“” 。 但 (1) 和 (2) 不起作用,因为 option() 不允许从其参数中提取结果,在本例中为 parserOptionalPart0/parserOptionalPart1。

现在正确的做法是什么?

非常感谢!

比利·R

Sorry if it's a novice question - I want to parse something defined by

Exp ::= Mandatory_Part Optional_Part0 Optional_Part1

I thought I could do this:

proc::Parser String

proc = do {

    ;str<-parserMandatoryPart

    ;str0<-optional(parserOptionalPart0)  --(1)

    ;str1<-optional(parserOptionalPart1)  --(2)

    ;return str++str0++str1

}

I want to get str0/str1 if optional parts are present, otherwise, str0/str1 would be "".
But (1) and (2) won't work since optional() doesn't allow extracting result from its parameters, in this case, parserOptionalPart0/parserOptionalPart1.

Now What would be the proper way to do it?

Many thanks!

Billy R

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

夜声 2024-10-04 09:28:35

您要查找的函数是 optionMaybe。如果解析器失败,它会返回 Nothing;如果它消耗了输入,则返回 Just 中的内容。

The function you're looking for is optionMaybe. It returns Nothing if the parser failed, and returns the content in Just if it consumed input.

粉红×色少女 2024-10-04 09:28:35

来自文档 :

选项 x p 尝试应用解析器 p。如果 p 在没有消耗输入的情况下失败,则返回值 x,否则返回 p 返回的值。

所以你可以这样做:

proc :: Parser String
proc = do
  str  <- parserMandatoryPart
  str0 <- option "" parserOptionalPart0
  str1 <- option "" parserOptionalPart1
  return (str++str0++str1)

注意“不消耗输入”部分。您可能需要使用 try 包装其中一个或两个可选解析器。

我还将您的代码风格调整为更加标准,并修复了最后一行的错误。 return 不是关键字;这是一个普通的函数。所以 return a ++ b(return a) ++ b,即几乎不是你想要的。

From the docs:

option x p tries to apply parser p. If p fails without consuming input, it returns the value x, otherwise the value returned by p.

So you could do:

proc :: Parser String
proc = do
  str  <- parserMandatoryPart
  str0 <- option "" parserOptionalPart0
  str1 <- option "" parserOptionalPart1
  return (str++str0++str1)

Watch out for the "without consuming input" part. You may need to wrap either or both optional parsers with try.

I've also adjusted your code style to be more standard, and fixed an error on the last line. return isn't a keyword; it's an ordinary function. So return a ++ b is (return a) ++ b, i.e. almost never what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文