org.gerweck.scala.util.TokenParserUtil.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gerweck-utils-java6_2.11 Show documentation
Show all versions of gerweck-utils-java6_2.11 Show documentation
General utilies for Scala applications
The newest version!
package org.gerweck.scala.util
import java.util.concurrent.ConcurrentHashMap
import scala.collection.JavaConverters._
import scala.reflect.{ ClassTag, classTag }
import scala.util.parsing.combinator.syntactical.TokenParsers
/** Mix-in utility code to assist with Parser development.
*
* @author Sarah Gerweck
*/
trait TokenParserUtil extends TokenParsers with ParserUtil {
private[this] val typeParsers = new ConcurrentHashMap[ClassTag[_ <: Elem], Parser[Elem]].asScala
/** A parser that matches elements of a given type. This is useful if you have
* a hierarchy of traits that extend from `Elem` and want to easily be able to
* match certain classes of tokens.
*/
final protected[this] def tpe[A <: Elem : ClassTag]: Parser[A] = {
val ct = classTag[A]
val p = typeParsers getOrElseUpdate (ct, {
val clzz = ct.runtimeClass
elem(clzz.getSimpleName, { clzz isInstance _ })
})
p.asInstanceOf[Parser[A]]
}
}