3

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

在此先感谢,基肖尔

4

1 回答 1

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进行了一些小的编辑:我已将分隔符从"to更改为"""并添加\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 的多行字符串文字的实现并不完全匹配(例如,字符串中不能有未转义"的字符),但它可以很容易地进行调整,并且可以按原样为您工作。

于 2012-08-09T18:35:14.163 回答