如何从Parsec中的可选解析器中检索值?

Bil*_*ong 6 parsing haskell parsec optional

对不起,如果这是一个新手问题 - 我想解析定义的东西

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

}
Run Code Online (Sandbox Code Playgroud)

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

现在做什么是正确的方法?

非常感谢!

比利河

Pau*_*aul 6

你正在寻找的功能是optionMaybe.Nothing如果解析器失败,它将返回,并在Just消耗输入时返回内容.


kee*_*gan 5

文档

option x p尝试应用解析器p。如果p在不使用输入的情况下失败,则返回x,否则返回p

因此,您可以执行以下操作:

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

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

我还对您的代码样式进行了调整,使其更加标准,并修复了最后一行的错误。 return不是关键字;这是一个普通的功能。所以,return a ++ b(return a) ++ b的,即几乎从来没有你想要的东西。