我正在学习编写一个简单的解析器组合器.我正在自下而上编写规则并编写单元测试来验证我的工作.但是,我阻止使用带有空格的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
我想知道正如我所描述的那样编写规则的正确方法是什么?
谢谢
默认情况下,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)中.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |