gpt4 book ai didi

parsing - scala:解析器帮助

转载 作者:行者123 更新时间:2023-12-01 11:07:32 25 4
gpt4 key购买 nike

我正在学习编写一个简单的解析器组合器。我正在自下而上地编写规则并编写单元测试以在我进行时进行验证。但是,我无法使用以空格作为分隔符的 repsep()。

object MyParser extends RegexParsers {
lazy val listVal:Parser[List[String]]=elem('{')<~repsep("""\d+""".r,"""\s+""".r)~>elem('}')
}

简化了规则以说明问题。当我向解析器提供“{1 2 3}”时,它总是提示它不匹配:

[1.4] failure: `}' expected but 2 found

我想知道按照我的描述编写规则的正确方法是什么?

谢谢

最佳答案

默认情况下,RegexParsers -derived 解析器在尝试匹配任何终端符号之前跳过空格。除非您的空白解释不寻常,否则您可以使用它。如果您希望视为被忽略的空格的特定字符(序列)不是默认值( \s+ ),您可以覆盖投影的 val whiteSpace: Regex = ...你的值(value) RegexParsers解析器。如果您不执行任何此类空格跳过操作,override def skipWhitespace = false .

编辑:所以是的,改变这个:

repsep("""\d+""".r,"""\s+""".r)

为此:

rep("""\d+""".r)

并保留 RegexParsers 中定义的所有其他内容不变应该做你想做的事。

顺便说一下repsep的常用用法用于逗号分隔列表之类的东西,您需要确保逗号在那里,但不需要将它们保留在生成的解析树(或 AST)中。

关于parsing - scala:解析器帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com