From 97832ff51a4417212bc49280a4b67c705c391176 Mon Sep 17 00:00:00 2001 From: Johannes Rudolph Date: Wed, 24 Feb 2016 17:59:03 +0100 Subject: include complete parsing failure in exception, fixes #15 Also improve error messages a bit. --- src/main/scala/spray/boilerplate/Generator.scala | 2 -- src/main/scala/spray/boilerplate/TemplateParser.scala | 11 +++++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/scala/spray/boilerplate/Generator.scala b/src/main/scala/spray/boilerplate/Generator.scala index 5576f56..db2feb9 100644 --- a/src/main/scala/spray/boilerplate/Generator.scala +++ b/src/main/scala/spray/boilerplate/Generator.scala @@ -6,8 +6,6 @@ */ package spray.boilerplate -import util.parsing.combinator.RegexParsers - object Generator { def generateFromTemplate(template: String, expandTo: Int): String = generate(TemplateParser.parse(template))(expandTo) diff --git a/src/main/scala/spray/boilerplate/TemplateParser.scala b/src/main/scala/spray/boilerplate/TemplateParser.scala index e70b156..99784d9 100644 --- a/src/main/scala/spray/boilerplate/TemplateParser.scala +++ b/src/main/scala/spray/boilerplate/TemplateParser.scala @@ -7,7 +7,6 @@ package spray.boilerplate import util.parsing.combinator.RegexParsers -import java.lang.RuntimeException sealed trait TemplateElement { def ~(next: TemplateElement): TemplateElement = Sequence(this, next) @@ -41,15 +40,15 @@ object TemplateParser extends RegexParsers { lazy val elements: Parser[TemplateElement] = rep1(element) ^^ maybeSequence lazy val element: Parser[TemplateElement] = offset | literalString | expand - lazy val offset: Parser[Offset] = offsetChars ^^ (s ⇒ Offset(s.toInt)) + lazy val offset: Parser[Offset] = offsetChars ^^ (s ⇒ Offset(s - '0')) lazy val literalString: Parser[LiteralString] = rep1(escapedSharp | escapedLiteralNumber | literalChar) ^^ (chs ⇒ LiteralString(chs.mkString)) lazy val literalChar: Parser[Char] = not(expandStart | """#[^\]]*\]""".r | offsetChars) ~> elem("Any character", _ != EOI) - lazy val offsetChars = "[012]".r + lazy val offsetChars: Parser[Char] = "[012]".r ^^ (_.head) | failure("'##' is used to quote '0', '1', or '2', use '\\#\\#' to output double hashes") - lazy val escapedSharp: Parser[Char] = "\\#" ^^ (_.drop(1).head) - lazy val escapedLiteralNumber: Parser[Char] = "##" ~> offsetChars ^^ (_.head) + lazy val escapedSharp: Parser[Char] = "\\#" ~> success('#') + lazy val escapedLiteralNumber: Parser[Char] = "##" ~! offsetChars ^^ { case _ ~ x ⇒ x } lazy val outsideLiteralString: Parser[LiteralString] = rep1(escapedSharp | outsideLiteralChar) ^^ (chs ⇒ LiteralString(chs.mkString)) lazy val outsideLiteralChar: Parser[Char] = not(expandStart) ~> elem("Any character", _ != EOI) @@ -77,6 +76,6 @@ object TemplateParser extends RegexParsers { def parse(input: String): TemplateElement = phrase(outsideElements)(new scala.util.parsing.input.CharArrayReader(input.toCharArray)) match { case Success(res, _) ⇒ res - case x: NoSuccess ⇒ throw new RuntimeException(x.msg) + case x: NoSuccess ⇒ throw new RuntimeException(s"Parsing failed: $x") } } -- cgit v1.2.3