2012-08-09 6 views
3

scala 파서 결합자를 사용하여 외부 DSL을 정의하려고합니다. 'stringLit'토큰 파서는 트리플 따옴표를 사용하여 여러 줄 문자열을 수용하지 못합니다. 스칼라 파서 결합 자의 세계에서 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.""" 

그것은 여러 줄 문자열 리터럴의 스칼라의 구현 (당신은 예를 들어, 문자열 이스케이프 "를 가질 수 없습니다) 정확히 일치 아니지만, 쉽게 불통 될 수 있으며, 당신을 위해 작동 할 수있다 그 것처럼.

+0

답변 해 주셔서 감사합니다. JavaTokenParsers 대신 StandardTokenParsers를 사용하는 경우 동일한 방법을 사용할 수 있습니까? –

+0

StandardTokenParser와 JavaTokenParser의 차이점에 대해 조금 읽은 후에, 필자는 후자와 함께 결론을 냈습니다. 나는 'StringLiteral'tokenizer를 사용하여 여분의 따옴표를 제거하기 위해 코드를 약간 수정해야했습니다. –