From e4c385c0f0a5c2adf1ad9a8ed3be663d67918997 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Sun, 16 Nov 2014 21:27:45 -0800 Subject: The parser has reached meta-circularity~! --- scalatexApi/src/main/scala/scalaparser/ScalaSyntax.scala | 9 ++++++--- .../src/main/scala/scalaparser/syntax/Literals.scala | 2 +- scalatexApi/src/test/scala/scalaparser/SyntaxTest.scala | 13 ++++++++----- 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") } } -- cgit v1.2.3