3
我想用scala分析器組合器來定義外部DSL。我發現'stringLit'標記解析器不能使用三重引號來容納多行字符串。在scala分析器組合世界中是否有類似於multiLineStringLit的東西?斯卡拉外部DSL - 多行字符串文字
由於提前, 紀
我想用scala分析器組合器來定義外部DSL。我發現'stringLit'標記解析器不能使用三重引號來容納多行字符串。在scala分析器組合世界中是否有類似於multiLineStringLit的東西?斯卡拉外部DSL - 多行字符串文字
由於提前, 紀
不,我知道的,但它不是太難寫你自己:
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,有什麼辦法可以實現嗎? – 2012-08-09 18:58:39
在閱讀了關於StandardTokenParsers和JavaTokenParsers之間差異的更多信息之後,我最終選擇了後者。我不得不修改我的代碼以刪除'StringLiteral'標記器的額外引號。 – 2012-08-16 17:29:56