我正在学习编写一个简单的解析器组合器。我正在自下而上编写规则并编写单元测试来验证我的工作。但是,我阻止使用带有空格的repsep()作为分隔符。
object MyParser extends RegexParsers {
lazy val listVal:Parser[List[String]]=elem('{')<~repsep("""\d+""".r,"""\s+""".r)~>elem('}')
}
简化规则以说明问题。当我用“{1 2 3}”提供解析器时,它总是抱怨它不匹配:
[1.4]失败:`}'预计但是2找到了
我想知道正如我所描述的那样编写规则的正确方法是什么?
由于
答案 0 :(得分:6)
默认情况下,RegexParsers
派生的解析器在尝试匹配任何终端符号之前跳过空格。除非您的空白解释不寻常,否则您可以使用它。如果您希望视为忽略空格的特定字符(序列)不是默认值(\s+
),则可以覆盖val whiteSpace: Regex = ...
解析器中的预计RegexParsers
值。如果你没有跳过任何这样的空格,override def skipWhitespace = false
。
修改:是的,更改此内容:
repsep("""\d+""".r,"""\s+""".r)
到此:
rep("""\d+""".r)
并保持RegexParsers
中定义的所有其他内容不变,应该做你想做的事。
顺便说一句,repsep
的常见用法是用于逗号分隔列表之类的东西,你需要确保逗号在那里,但不需要将它们保存在生成的解析树(或AST)中