From d6a356156c1f9e8d8f9207b70731cb917fb38ee9 Mon Sep 17 00:00:00 2001 From: Li Haoyi Date: Fri, 28 Nov 2014 06:46:30 -0800 Subject: All scala-js files are parsed --- .../src/main/scala/scalaParser/ScalaSyntax.scala | 28 ++++++++++++---------- .../main/scala/scalaParser/syntax/Literals.scala | 22 ++++++++++++----- scalaParser/src/test/resources/test.scala | 7 ++++-- .../src/test/scala/scalaParser/SyntaxTest.scala | 13 ++++++++++ 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala b/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala index 0792fd9..ef5eb4a 100644 --- a/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala +++ b/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala @@ -277,7 +277,9 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif oneOrMore(Pattern1).separatedBy('|') } def Pattern1: R0 = rule { - K.W("_") ~ K.O(":") ~ TypePat | VarId ~ K.O(":") ~ TypePat | Pattern2 + K.W("_") ~ K.O(":") ~ TypePat | + VarId ~ K.O(":") ~ TypePat | + Pattern2 } def Pattern2: R0 = { def Pattern3: R0 = rule { @@ -289,18 +291,18 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif def SimplePattern: R0 = { def Patterns: R0 = rule { K.W("_") ~ '*' | oneOrMore(Pattern).separatedBy(',') } rule { - K.W("_") | - Literal | - '(' ~ optional(Patterns) ~ ')' | - ( - StableId ~ - optional( - '(' ~ - (optional(Patterns ~ ',') ~ optional(VarId ~ '@') ~ K.W("_") ~ '*' | optional(Patterns)) ~ - ')' - ) - ) | - VarId + K.W("_") ~ optional(K.O(":") ~ TypePat) | + Literal | + '(' ~ optional(Patterns) ~ ')' | + ( + StableId ~ + optional( + '(' ~ + (optional(Patterns ~ ',') ~ optional(VarId ~ '@') ~ K.W("_") ~ '*' | optional(Patterns)) ~ + ')' + ) + ) | + VarId } } diff --git a/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala b/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala index 4e3d119..f854671 100644 --- a/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala +++ b/scalaParser/src/main/scala/scalaParser/syntax/Literals.scala @@ -4,6 +4,7 @@ import acyclic.file import org.parboiled2._ trait Literals { self: Parser with Basic with Identifiers => + def Expr: Rule0 object Literals{ import Basic._ def FloatingPointLiteral = rule { @@ -23,7 +24,7 @@ trait Literals { self: Parser with Basic with Identifiers => def MultilineComment: Rule0 = rule { "/*" ~ zeroOrMore(MultilineComment | !"*/" ~ ANY) ~ "*/" } def Comment: Rule0 = rule { MultilineComment | - "//" ~ zeroOrMore(!Basic.Newline ~ ANY) ~ &(Basic.Newline | EOI) + "//" ~ zeroOrMore(!Basic.Newline ~ ANY) ~ &(Basic.Newline | EOI) } def Literal = rule { @@ -36,18 +37,27 @@ trait Literals { self: Parser with Basic with Identifiers => } - def EscapedChars = rule { '\\' ~ anyOf("rnt\\\"") } + def EscapedChars = rule { '\\' ~ anyOf("btnfr'\\\"") } // Note that symbols can take on the same values as keywords! def SymbolLiteral = rule { ''' ~ (Identifiers.PlainId | Identifiers.Keywords) } - def CharacterLiteral = rule { ''' ~ (UnicodeExcape | EscapedChars | !'\\' ~ CharPredicate.from(isPrintableChar)) ~ ''' } + def CharacterLiteral = rule { + ''' ~ (UnicodeExcape | EscapedChars | !'\\' ~ CharPredicate.from(isPrintableChar)) ~ ''' + } - def MultiLineChars = rule { zeroOrMore(optional('"') ~ optional('"') ~ noneOf("\"")) } + def MultiLineChars = rule { + zeroOrMore(Interpolation | optional('"') ~ optional('"') ~ noneOf("\"")) + } def pr(s: String) = rule { run(println(s"LOGGING $cursor: $s")) } + def Interpolation = rule{ + "$" ~ Identifiers.Id | "${" ~ Expr ~ "}" | "$$" + } def StringLiteral = rule { - (optional(Identifiers.Id) ~ "\"\"\"" ~ MultiLineChars ~ ("\"\"\"" ~ zeroOrMore('"'))) | - (optional(Identifiers.Id) ~ '"' ~ zeroOrMore("\\\"" | "\\\\" | noneOf("\n\"")) ~ '"') + (Identifiers.Id ~ "\"\"\"" ~ MultiLineChars ~ ("\"\"\"" ~ zeroOrMore('"'))) | + (Identifiers.Id ~ '"' ~ zeroOrMore(Interpolation | "\\\"" | "\\\\" | noneOf("\n\"")) ~ '"') | + ("\"\"\"" ~ MultiLineChars ~ ("\"\"\"" ~ zeroOrMore('"'))) | + ('"' ~ zeroOrMore("\\\"" | "\\\\" | noneOf("\n\"")) ~ '"') } def isPrintableChar(c: Char): Boolean = { diff --git a/scalaParser/src/test/resources/test.scala b/scalaParser/src/test/resources/test.scala index 60f93d8..62dd0a3 100644 --- a/scalaParser/src/test/resources/test.scala +++ b/scalaParser/src/test/resources/test.scala @@ -1,3 +1,6 @@ -@RawJSType // Don't do this at home! -sealed trait UndefOr[A] +object OptimizerCore { + tpe match { + case NothingType | _:RecordType=> 1 + } +} diff --git a/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala b/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala index abb17fe..6388d71 100644 --- a/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala +++ b/scalaParser/src/test/scala/scalaParser/SyntaxTest.scala @@ -595,6 +595,19 @@ object SyntaxTest extends TestSuite{ | """.stripMargin ) + * - check( + """trait Writer{ + | '\f' + |} + """.stripMargin + ) + * - check( + """object CyclicDependencyException { + | def str(info: ResolutionInfo) = + | s"${info.resourceName} from: ${info.origins.mkString(", ")}" + |} + """.stripMargin + ) } 'neg{ * - checkNeg( -- cgit v1.2.3