scala パーサー コンビネーターを使用して外部 DSL を定義しようとしています。「stringLit」トークン パーサーは、三重引用符を使用した複数行の文字列に対応していません。scala パーサー コンビネーターの世界で multiLineStringLit に似たものはありますか?
前もってありがとう、キショア
私が知っているわけではありませんが、自分で書くのはそれほど難しくありません:
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 の実装と完全に一致するわけではありませんが ("
たとえば、文字列にエスケープされていない文字列を含めることはできません)、簡単に微調整でき、そのままで機能する可能性があります。