aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/cc/spray/boilerplate/TemplateParser.scala
diff options
context:
space:
mode:
authorJohannes Rudolph <johannes_rudolph@gmx.de>2012-10-10 12:29:01 +0200
committerJohannes Rudolph <johannes_rudolph@gmx.de>2012-10-10 12:29:01 +0200
commit3fb580276af6bc12861de42c0115c04549c98177 (patch)
treeac358d8d558474c965020572196897e3a3e37b98 /src/main/scala/cc/spray/boilerplate/TemplateParser.scala
parent7ccabd803ca26cde46c970c7fea45d59b7c54b3d (diff)
downloadsbt-boilerplate-3fb580276af6bc12861de42c0115c04549c98177.tar.gz
sbt-boilerplate-3fb580276af6bc12861de42c0115c04549c98177.tar.bz2
sbt-boilerplate-3fb580276af6bc12861de42c0115c04549c98177.zip
simplified syntax and provide a proper parser
Diffstat (limited to 'src/main/scala/cc/spray/boilerplate/TemplateParser.scala')
-rw-r--r--src/main/scala/cc/spray/boilerplate/TemplateParser.scala50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/main/scala/cc/spray/boilerplate/TemplateParser.scala b/src/main/scala/cc/spray/boilerplate/TemplateParser.scala
new file mode 100644
index 0000000..4e280a4
--- /dev/null
+++ b/src/main/scala/cc/spray/boilerplate/TemplateParser.scala
@@ -0,0 +1,50 @@
+package cc.spray.boilerplate
+
+import util.parsing.combinator.RegexParsers
+import java.lang.RuntimeException
+
+sealed trait TemplateElement
+case class Sequence(elements: Seq[TemplateElement]) extends TemplateElement
+case class LiteralString(literal: String) extends TemplateElement
+case class FixedString(literal: String) extends TemplateElement
+case class Expand(inner: TemplateElement, separator: String) extends TemplateElement
+
+object TemplateParser extends RegexParsers {
+ override type Elem = Char
+ type Tokens = TemplateElement
+ override val skipWhitespace = false
+
+ def elements: Parser[TemplateElement] = rep1(element) ^^ {
+ case one :: Nil => one
+ case several => Sequence(several)
+ }
+
+ def element: Parser[TemplateElement] = literal | fixed | expand
+
+ def literalChar: Parser[String] = """(?s:(?!\[#)(?!#[^\]]*\]).)""".r
+ def literalChars: Parser[String] = rep1(literalChar) ^^ { _.reduceLeft(_ + _) }
+
+ def literal: Parser[LiteralString] = literalChars ^^ LiteralString
+
+ def fixed: Parser[FixedString] = "##" ~> ".".r ^^ (new String(_)) ^^ FixedString
+
+ def expand: Parser[Expand] = "[#" ~> elements ~ "#" ~ separatorChars <~ "]" ^^ {
+ case els ~ x ~ sep => Expand(els, sep.getOrElse(", "))
+ }
+
+ def separatorChars: Parser[Option[String]] = rep("""[^\]]""".r) ^^ (_.reduceLeftOption(_ + _))
+
+ def parse(input:String): TemplateElement =
+ phrase(elements)(new scala.util.parsing.input.CharArrayReader(input.toCharArray)) match {
+ case Success(res,_) => res
+ case x:NoSuccess => throw new RuntimeException(x.msg)
+ }
+}
+
+object TestParser extends App {
+ def check(format: String) {
+ println(TemplateParser.parse(format))
+ }
+
+ check("[#abc ##1 # ++ ]")
+} \ No newline at end of file