Scala 外部 DSL -- 多行字符串字面量

3

我正在尝试使用Scala解析器组合器定义一个外部DSL。我发现'stringLit'标记解析器不能使用三引号来处理多行字符串。在Scala解析器组合器世界中是否有类似于'multiLineStringLit'的东西?

谢谢, Kishore

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:我将分隔符从"改为"""并在字符匹配中添加了\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多行字符串文字的精确匹配(例如,您不能在字符串中有未转义的"),但它可以轻松地进行调整,并且可能适合您的需求。


谢谢您的回复。如果我使用StandardTokenParsers而不是JavaTokenParsers,有没有实现相同效果的方法? - Kishore R
在进一步了解StandardTokenParsers和JavaTokenParsers之间的区别后,我最终选择了JavaTokenParsers。我不得不稍微修改我的代码,以使用'StringLiteral'分词器去掉额外的引号。 - Kishore R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接