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、いくつかのマイナーな編集によるものです。区切り文字を から"に変更し、文字の一致に"""追加しました。\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 に答える