summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-03 01:01:00 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-03 01:01:00 -0800
commit52373d64b86ed514998ff5e6a128bf26b77e9f2e (patch)
tree4e45978fc21de186e71549b139934165a9bcd2cb
parent5cf89bb9d5e0d3c42610d3d2be47815ef41ecd65 (diff)
downloadhands-on-scala-js-52373d64b86ed514998ff5e6a128bf26b77e9f2e.tar.gz
hands-on-scala-js-52373d64b86ed514998ff5e6a128bf26b77e9f2e.tar.bz2
hands-on-scala-js-52373d64b86ed514998ff5e6a128bf26b77e9f2e.zip
WIP
-rw-r--r--scalatexApi/src/main/scala/scalatex/ScalatexParser.scala63
-rw-r--r--scalatexApi/src/test/scala/scalatex/ParserTests.scala (renamed from scalatexApi/src/test/scala/scalatex/Main.scala)13
2 files changed, 66 insertions, 10 deletions
diff --git a/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala b/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
index 406f4cd..721af40 100644
--- a/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
+++ b/scalatexApi/src/main/scala/scalatex/ScalatexParser.scala
@@ -7,31 +7,76 @@ trait Ast{
def offset: Int
}
object Ast{
- case class Block(parts: Seq[Block.Sub], offset: Int = 0) extends Chain.Sub
+ case class Block(parts: Seq[Block.Sub], offset: Int = 0) extends Chain.Sub{
+ println("Init Block")
+ }
object Block{
trait Sub
- case class Text(txt: String, offset: Int = 0) extends Block.Sub
+ case class Text(txt: String, offset: Int = 0) extends Block.Sub{
+ println("Init Text " + txt)
+ }
}
case class Code(code: String, offset: Int = 0)
- case class Chain(lhs: Code, parts: Seq[Chain.Sub], offset: Int = 0) extends Block.Sub
+ case class Chain(lhs: Code, parts: Seq[Chain.Sub], offset: Int = 0) extends Block.Sub{
+ println("Init Chain " + lhs)
+ }
object Chain{
trait Sub
case class Prop(str: String, offset: Int = 0) extends Sub
case class Args(str: String, offset: Int = 0) extends Sub
}
}
-class ScalatexParser(input: ParserInput) extends ScalaSyntax(input) {
- def TextNot(chars: String) = rule { capture(oneOrMore(noneOf(chars) | "@@")) ~> (x => Ast.Block.Text(x.replace("@@", "@"))) }
+class ScalatexParser(input: ParserInput, indent: Int = 0) extends ScalaSyntax(input) {
+ println("INDENT " + indent)
+ def TextNot(chars: String) = rule {
+ capture(oneOrMore(noneOf(chars + "\n"))) ~> {
+ x => Ast.Block.Text(x.replace("@@", "@"))
+ }
+ }
def Text = TextNot("@")
def Code = rule {
"@" ~ capture(Id | BlockExpr | ('(' ~ optional(Exprs) ~ ')')) ~> (Ast.Code(_))
}
- def ScalaChain = rule { Code ~ zeroOrMore(Extension) ~> (Ast.Chain(_, _)) }
+ def BlankLine = rule{ run(println("BL A " + (cursorChar.toInt, '\n'.toInt))) ~ '\n' ~ run(println("BL B")) ~ zeroOrMore(' ') ~ run(println("BL C")) ~ &('\n') ~ run(println("BL D")) }
+ def Indent = rule{ run(println("Indent A " + cursorChar.toInt)) ~ '\n' ~ run(println("Indent A")) ~ indent.times(' ') ~ run(println("Indent A")) ~ zeroOrMore(' ') }
+ def LoneScalaChain: Rule1[Ast.Chain] = rule {
+ run(println("LSC Indent")) ~ Indent ~
+ run(println("LSC SC")) ~ ScalaChain ~
+ zeroOrMore(BlankLine) ~
+ run(println("LSC NewLine")) ~
+ runSubParser {
+ new ScalatexParser(_, indent + 2).Body
+ } ~> { (chain: Ast.Chain, body: Ast.Block) =>
+ println("chain.copy " + body)
+ chain.copy(parts = chain.parts :+ body)
+ }
+ }
+
+ def newInput(s: String, x: ParserInput): String = {
+ def newInput = '\n' + s + x.sliceString(0, x.length)
+ println(newInput.split("\n").map("|" + _ + "|").mkString("\n"))
+ newInput
+ }
+ def ScalaChain = rule {
+ Code ~ zeroOrMore(Extension) ~> {Ast.Chain(_, _)}
+ }
def Extension: Rule1[Ast.Chain.Sub] = rule {
(capture(('.' ~ Id) ~ optional(TypeArgs)) ~> (Ast.Chain.Prop(_))) |
- (capture(!BlockExpr ~ ArgumentExprs) ~> (Ast.Chain.Args(_))) |
- TBlock
+ (capture(!BlockExpr ~ ArgumentExprs) ~> (Ast.Chain.Args(_))) |
+ TBlock
}
def TBlock = rule{ '{' ~ Body ~ '}' }
- def Body = rule{ zeroOrMore(TextNot("@}") | ScalaChain) ~> (x => Ast.Block(x)) }
+ def Body = rule{
+ run(println("BODY")) ~
+ zeroOrMore(
+ run(println("Body LSC")) ~ LoneScalaChain |
+ run(println("Body TextNot")) ~ TextNot("@}") |
+ run(println("Body Indent")) ~ (capture(Indent) ~> (Ast.Block.Text(_))) |
+ run(println("Body BlankLine")) ~ (capture(BlankLine) ~> (Ast.Block.Text(_)))
+// | ScalaChain
+ ) ~> {x =>
+ println("BODY ENDED: " + x)
+ Ast.Block(x)
+ }
+ }
}
diff --git a/scalatexApi/src/test/scala/scalatex/Main.scala b/scalatexApi/src/test/scala/scalatex/ParserTests.scala
index fa0d213..34c6fdb 100644
--- a/scalatexApi/src/test/scala/scalatex/Main.scala
+++ b/scalatexApi/src/test/scala/scalatex/ParserTests.scala
@@ -4,7 +4,7 @@ package scalatex
import org.parboiled2._
import torimatomeru.ScalaSyntax
-object Main extends utest.TestSuite{
+object ParserTests extends utest.TestSuite{
import Ast._
import utest._
def check[T](input: String, parse: ScalatexParser => scala.util.Try[T], expected: T) = {
@@ -51,6 +51,17 @@ object Main extends utest.TestSuite{
))
)
}
+ 'Body{
+
+ val str =
+ """
+ |@omg
+ | @wtf
+ | @bbq
+ | @lol
+ """.stripMargin
+ new ScalatexParser(str).Body.run()
+ }
}
}