6

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

4

2 回答 2

6

您正在寻找的功能是optionMaybe. Nothing如果解析器失败,它会返回,Just如果它使用输入则返回内容。

于 2010-10-13T07:31:45.317 回答
5

文档

option x p尝试应用 parser p。如果p在不消耗输入的情况下失败,则返回 value x,否则返回 value 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,即几乎从来没有你想要的。

于 2010-10-13T07:33:52.587 回答