scala:解析器帮助

EnT*_*Cas 3 parsing scala

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

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

简化了规则以说明问题.当我用"{1 2 3}"提供解析器时,它总是抱怨它不匹配:

[1.4]失败:'}'预期但发现2

我想知道正如我所描述的那样编写规则的正确方法是什么?

谢谢

Ran*_*ulz 6

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

编辑:是的,改变这个:

repsep("""\d+""".r,"""\s+""".r)
Run Code Online (Sandbox Code Playgroud)

对此:

rep("""\d+""".r)
Run Code Online (Sandbox Code Playgroud)

并且保留其他所有未定义的内容RegexParsers应该做你想要的.

顺便说一句,常用的repsep是逗号分隔列表,你需要确保逗号在那里,但不需要将它们保存在生成​​的解析树(或AST)中.