如何从秒差距中的可选解析器检索值?
抱歉,如果这是一个新手问题 - 我想解析由
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您要查找的函数是
optionMaybe
。如果解析器失败,它会返回Nothing
;如果它消耗了输入,则返回Just
中的内容。The function you're looking for is
optionMaybe
. It returnsNothing
if the parser failed, and returns the content inJust
if it consumed input.来自文档 :
所以你可以这样做:
注意“不消耗输入”部分。您可能需要使用
try
包装其中一个或两个可选解析器。我还将您的代码风格调整为更加标准,并修复了最后一行的错误。
return
不是关键字;这是一个普通的函数。所以return a ++ b
是(return a) ++ b
,即几乎不是你想要的。From the docs:
So you could do:
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. Soreturn a ++ b
is(return a) ++ b
, i.e. almost never what you want.