我为内部表达式语言编写了一个Scala解析器,该语言具有双引号分隔的字符串文字:
object MyParser extends JavaTokenParsers {
lazy val strLiteral = "\"" ~> """[^"]*""".r <~ "\"" ^^ {
case x ⇒ StringLiteral(x)
}
// ...
}
(实际代码有点不同,因为我支持""
作为文字双引号的转义序列。虽然这与讨论无关,但这就是为什么我不能只使用{{1} }'JavaTokenParsers
)。
我注意到解析器在字符串的开头和结尾都没有包含空格:
stringLiteral
我尝试在正则表达式中匹配空格:
"a" parsed as StringLiteral("a")
" a" parsed as StringLiteral("a")
"a " parsed as StringLiteral("a")
" a " parsed as StringLiteral("a")
并使用显式"\"" ~> """\s*[^"]*\s*""".r <~ "\""
解析器:
whiteSpace
但在这两种情况下,"\"" ~> whiteSpace.? ~ """[^"]*""".r ~ whiteSpace.? <~ "\""
运算符已经消耗并忽略了空格,然后才有机会读取和处理它们。
我知道我可以设置~>
,但我不愿意,因为一般来说我想在这种语言中允许任意空格围绕令牌。
在字符串文字中包含周围空格的简单而干净的策略是什么?
答案 0 :(得分:1)
您可以选择使用单个正则表达式来表示字符串文字:
val stringLiteral:Parser[String] = """"([^"]*("")?)*"""".r
然后删除匹配的引号。