Scala External DSL - 多行字符串文字

时间:2012-08-09 17:47:10

标签: scala dsl

我正在尝试使用scala解析器组合器定义外部DSL。我看到'stringLit'令牌解析器不能使用三引号来容纳多行字符串。在scala解析器组合世界中是否有类似于multiLineStringLit的东西?

提前致谢, 基肖尔马布

1 个答案:

答案 0 :(得分:3)

不是我知道的,但写自己的并不难:

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实现多行字符串文字的完全匹配(例如,你不能在字符串中使用未转义的"),但它可以轻松调整,并可能适合你原样。