Parsing scala:解析器帮助

Parsing scala:解析器帮助,parsing,scala,Parsing,Scala,我正在学习编写一个简单的解析器组合器。我正在自下而上编写规则,并编写单元测试来进行验证。但是,我无法使用带有空格的repsep()作为分隔符 object MyParser extends RegexParsers { lazy val listVal:Parser[List[String]]=elem('{')<~repsep("""\d+""".r,"""\s+""".r)~>elem('}') } objectmyparser扩展regexparser{ lazy val

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

object MyParser extends RegexParsers {
  lazy val listVal:Parser[List[String]]=elem('{')<~repsep("""\d+""".r,"""\s+""".r)~>elem('}')
}
objectmyparser扩展regexparser{
lazy val listVal:Parser[List[String]=elem('{')elem('}'))
}
为了说明这个问题,这条规则被简化了。当我向解析器提供“{1 2 3}”时,它总是抱怨它不匹配:

[1.4]失败:应为`},但找到2个

我想知道我所描述的写规则的正确方法是什么


感谢

默认情况下,
RegexParsers
-派生解析器在尝试匹配任何终端符号之前跳过空白。除非你的空白解释是不寻常的,你可以用它。如果要视为忽略空白的特定字符(序列)不是默认字符(
\s+
),则可以在
RegexParsers
解析器中重写投影的
val空白:Regex=…
值。如果不知道会发生什么样的空白跳过,
覆盖def skipWhitespace=false

编辑:是的,更改此选项:

repsep("""\d+""".r,"""\s+""".r)
为此:

rep("""\d+""".r)
保持
RegexParsers
中定义的所有其他内容不变应该可以满足您的需要

顺便说一句,
repsep
的常见用法是用于逗号分隔的列表,您需要确保逗号在那里,但不需要将它们保留在结果解析树(或AST)中。

aka将
repsep(““\d+”.r…)
更改为
rep(“\d+”.r)