2012-08-09 44 views
3

我想用scala分析器組合器來定義外部DSL。我發現'stringLit'標記解析器不能使用三重引號來容納多行字符串。在scala分析器組合世界中是否有類似於multiLineStringLit的東西?斯卡拉外部DSL - 多行字符串文字

由於提前, 紀

回答

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的實現多行字符串字面量(你不能有字符串中的轉義",例如)完全匹配,但它可以很容易地進行調整,並可能爲你工作就這樣。

+0

感謝您的回覆。如果我使用StandardTokenParsers而不是JavaTokenParsers,有什麼辦法可以實現嗎? – 2012-08-09 18:58:39

+0

在閱讀了關於StandardTokenParsers和JavaTokenParsers之間差異的更多信息之後,我最終選擇了後者。我不得不修改我的代碼以刪除'StringLiteral'標記器的額外引號。 – 2012-08-16 17:29:56