Piszę makro m(expr: String)
, gdzie expr
jest wyrazem w jakimś języku (nie Scala):Jak odróżnić potrójne cytaty od pojedynczych cudzysłowów w makrach?
m("SOME EXPRESSION")
m("""
SOME EXPRESSION
""")
Kiedy jestem parsowania wyrażenie chciałbym zgłosić komunikaty o błędach z odpowiednich miejscach w pliku źródłowym. Aby to osiągnąć, powinienem znać lokalizację literału literowego i liczbę cytowań literału (3 lub 1). Niestety, nie znaleźliśmy żadnej metody, która zwraca liczbę cytatów dosłowne:
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
object Temp {
def m(s: String) : String = macro mImpl
def mImpl(context: Context)(s: context.Expr[String]): context.universe.Tree = {
import context.universe._
s match {
case l @ Literal(Constant(p: String)) =>
if (l.<TRIPLE QUOTES>) {
...
} else {
...
}
case _ =>
context.abort(context.enclosingPosition, "The argument of m must be a string literal")
}
}
}
Co należy umieścić zamiast <TRIPLE QUOTES>
?
Czy próbowałeś dopasować 'l' do wzoru z pojedynczymi znakami i wzorem z potrójnymi qoutami? Zobacz: http://stackoverflow.com/questions/9770416/scala-case-match-partial-string – mpkorstanje