Parsing scala:解析器帮助
我正在学习编写一个简单的解析器组合器。我正在自下而上编写规则,并编写单元测试来进行验证。但是,我无法使用带有空格的repsep()作为分隔符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
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)
?