summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-16 21:27:45 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-16 21:27:45 -0800
commite4c385c0f0a5c2adf1ad9a8ed3be663d67918997 (patch)
treeeac2a09badd3c4a556253a13191237de0f6591bc
parent79fa15b304d36f24fa9dd9c9d9552a6c598c5739 (diff)
downloadhands-on-scala-js-e4c385c0f0a5c2adf1ad9a8ed3be663d67918997.tar.gz
hands-on-scala-js-e4c385c0f0a5c2adf1ad9a8ed3be663d67918997.tar.bz2
hands-on-scala-js-e4c385c0f0a5c2adf1ad9a8ed3be663d67918997.zip
The parser has reached meta-circularity~!
-rw-r--r--scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala9
-rw-r--r--scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala2
-rw-r--r--scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala13
3 files changed, 15 insertions, 9 deletions
diff --git a/scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala b/scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala
index 989e6d9..264c79c 100644
--- a/scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala
+++ b/scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala
@@ -130,11 +130,14 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
ForCFlow(G) |
"throw" ~ Expr(G) |
"return" ~ optional(Expr(G)) |
- SimpleExpr() ~ ArgumentExprs() ~ '=' ~ Expr(G) |
- optional(SimpleExpr() ~ '.') ~ Id() ~ '=' ~ Expr(G) |
+ NaiveAssignment(G) |
+ SimpleExpr() ~ (
+ ArgumentExprs() ~ '=' ~ Expr(G) |
+ '.' ~ NaiveAssignment(G)
+ ) |
PostfixExpr(false) ~ optional("match" ~ '{' ~ CaseClauses ~ StrW("}", false) | Ascription(false)) ~ W(G)
}
-
+ def NaiveAssignment(G: B = t) = rule{ Id() ~ '=' ~ Expr(G) }
def IfCFlow(G: B = t) = rule { "if" ~ '(' ~ Expr() ~ ')' ~ zeroOrMore(Newline) ~ Expr(G) ~ optional(optional(Semi) ~ "else" ~ Expr(G)) }
def WhileCFlow(G: B = t) = rule { "while" ~ '(' ~ Expr() ~ ')' ~ zeroOrMore(Newline) ~ Expr(G) }
def TryCFlow(G: B = t) = rule { "try" ~ '{' ~ Block ~ StrW("}", G) ~ optional("catch" ~ '{' ~ CaseClauses ~ StrW("}", G)) ~ optional("finally" ~ Expr(G)) }
diff --git a/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala b/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala
index 11eb943..8aaf664 100644
--- a/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala
+++ b/scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala
@@ -37,7 +37,7 @@ trait Literals { self: Parser with Basic with Identifiers =>
def EscapedChars = rule { '\\' ~ anyOf("rnt\\\"") }
- def SymbolLiteral = rule { ''' ~ capture(Identifiers.PlainId) }
+ def SymbolLiteral = rule { ''' ~ capture(Identifiers.PlainId | Identifiers.Keywords) }
def CharacterLiteral = rule { ''' ~ capture(UnicodeExcape | EscapedChars | !'\\' ~ CharPredicate.from(isPrintableChar)) ~ ''' }
diff --git a/scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala b/scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala
index 8036896..10f6ed9 100644
--- a/scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala
+++ b/scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala
@@ -215,22 +215,25 @@ object SyntaxTest extends TestSuite{
println("Checking")
'file{
def checkFile(path: String) = check(io.Source.fromFile(path).mkString)
- * - checkFile("scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala")
+
* - checkFile("scalatexApi/src/main/scala/scalaparser/syntax/Basic.scala")
* - checkFile("scalatexApi/src/main/scala/scalaparser/syntax/Identifiers.scala")
* - checkFile("scalatexApi/src/main/scala/scalaparser/syntax/Literals.scala")
- // All the commented files seem to make the parser run forever. There's probably
- // some exponential performance somewhere in there, but I can't see it =/
* - checkFile("scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala")
- * - checkFile("scalatexApi/src/test/scala/scalatex/TestUtil.scala")
+
+ * - checkFile("scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala")
+
* - checkFile("scalatexApi/src/main/scala/scalatex/stages/Compiler.scala")
* - checkFile("scalatexApi/src/main/scala/scalatex/stages/Parser.scala")
-// * - checkFile("scalatexApi/src/test/scala/scalatex/ParserTests.scala")
* - checkFile("scalatexApi/src/main/scala/scalatex/stages/Trim.scala")
* - checkFile("scalatexApi/src/main/scala/scalatex/package.scala")
+ * - checkFile("scalatexApi/src/test/scala/scalatex/ParserTests.scala")
+ * - checkFile("scalatexApi/src/test/scala/scalatex/BasicTests.scala")
+ * - checkFile("scalatexApi/src/test/scala/scalatex/ErrorTests.scala")
+ * - checkFile("scalatexApi/src/test/scala/scalatex/TestUtil.scala")
}
}