我正在尝试使用Scala解析器组合器定义一个外部DSL。我发现'stringLit'标记解析器不能使用三引号来处理多行字符串。在Scala解析器组合器世界中是否有类似于'multiLineStringLit'的东西?
谢谢, Kishore
import scala.util.parsing.combinator._
object myParser extends JavaTokenParsers {
def mlStringLiteral: Parser[String] = (
"\"\"\"" +
"""(\n|[^"\p{Cntrl}\\]|\\[\\/bfnrt]|\\u[a-fA-F0-9]{4})*""" +
"\"\"\""
).r
}
这只是带有一些小修改的stringLiteral
:我将分隔符从"
改为"""
并在字符匹配中添加了\n
。
scala> val s = "\"\"\"This is a multi-\nline string literal.\"\"\""
s: java.lang.String =
"""This is a multi-
line string literal."""
scala> myParser.parseAll(myParser.mlStringLiteral, s)
res0: myParser.ParseResult[String] =
[2.24] parsed: """This is a multi-
line string literal."""
这不是Scala多行字符串文字的精确匹配(例如,您不能在字符串中有未转义的"
),但它可以轻松地进行调整,并且可能适合您的需求。