scala:解析器帮助

时间:2010-09-27 03:31:19

标签: parsing scala

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

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

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

  

[1.4]失败:`}'预计但是2找到了

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

由于

1 个答案:

答案 0 :(得分:6)

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

修改:是的,更改此内容:

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

到此:

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

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

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