summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-11-28 00:45:21 -0800
committerLi Haoyi <haoyi@dropbox.com>2014-11-28 00:45:21 -0800
commiteb384564fae6282d46a251fe8e91034e88c8dda4 (patch)
tree201aa9edb5e629fd6827150f16f973069fbc04cd
parenta4f1bb1d021109cce5d0f5ba5e37592b9c66a7cf (diff)
downloadhands-on-scala-js-eb384564fae6282d46a251fe8e91034e88c8dda4.tar.gz
hands-on-scala-js-eb384564fae6282d46a251fe8e91034e88c8dda4.tar.bz2
hands-on-scala-js-eb384564fae6282d46a251fe8e91034e88c8dda4.zip
More refactorings to standardize identifier/keyword "make sure it can't continue" behavior"
-rw-r--r--scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala28
-rw-r--r--scalaParser/src/main/scala/scalaParser/syntax/Identifiers.scala28
-rw-r--r--scalaParser/src/test/resources/test.scala8
3 files changed, 24 insertions, 40 deletions
diff --git a/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala b/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala
index d9c5d4b..4ba79a8 100644
--- a/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala
+++ b/scalaParser/src/main/scala/scalaParser/ScalaSyntax.scala
@@ -260,8 +260,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
}
}
-
-
def ResultExpr: R0 = Expr
def CaseClauses: R0 = {
@@ -325,9 +323,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
rule { zeroOrMore(Param).separatedBy(',') }
}
-
-
-
def ClassParam: R0 = rule {
zeroOrMore(Annotation) ~
optional(zeroOrMore(Modifier) ~ (K.W("val") | K.W("var"))) ~
@@ -337,9 +332,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
optional(K.O("=") ~ Expr)
}
-
-
-
def Modifier: R0 = rule { LocalModifier | AccessModifier | K.W("override") }
def LocalModifier: R0 = rule { K.W("abstract") | K.W("final") | K.W("sealed") | K.W("implicit") | K.W("lazy") }
def AccessModifier: R0 = {
@@ -347,7 +339,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
rule { (K.W("private") | K.W("protected")) ~ optional(AccessQualifier) }
}
-
def Annotation: R0 = rule { '@' ~ SimpleType ~ zeroOrMore(WL ~ ArgumentExprs) }
def TemplateBody: R0 = rule {
@@ -373,10 +364,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
rule { K.W("import") ~ oneOrMore(ImportExpr).separatedBy(',') }
}
-
-
-
-
def Dcl: R0 = {
def VarDcl: R0 = rule { Ids ~ K.O(":") ~ Type }
@@ -384,9 +371,9 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
rule {
K.W("val") ~ ValDcl |
- K.W("var") ~ VarDcl |
- K.W("def") ~ FunDcl |
- K.W("type") ~ zeroOrMore(Newline) ~ TypeDcl
+ K.W("var") ~ VarDcl |
+ K.W("def") ~ FunDcl |
+ K.W("type") ~ zeroOrMore(Newline) ~ TypeDcl
}
}
def FunSig: R0 = rule { Id ~ optional(FunTypeParamClause) ~ ParamClauses }
@@ -416,8 +403,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
rule { K.W("def") ~ FunDef | K.W("type") ~ zeroOrMore(Newline) ~ TypeDef | PatVarDef | TmplDef }
}
-
-
def TypeDef: R0 = rule { Id ~ optional(TypeParamClause) ~ K.O("=") ~ Type }
def TmplDef: R0 = {
@@ -491,7 +476,6 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
rule{ '{' ~ optional(oneOrMore(EarlyDef).separatedBy(Semis)) ~ '}' ~ K.W("with") }
}
-
def ConstrBlock: R0 = rule { '{' ~ SelfInvocation ~ optional(Semis ~ BlockStats) ~ '}' }
def SelfInvocation: R0 = rule { K.W("this") ~ oneOrMore(ArgumentExprs) }
@@ -500,9 +484,9 @@ class ScalaSyntax(val input: ParserInput) extends Parser with Basic with Identif
def Packaging: R0 = rule { K.W("package") ~ QualId ~ '{' ~ TopStatSeq ~ '}' }
def TopStat: R0 = rule {
Packaging |
- PackageObject |
- Import |
- zeroOrMore(Annotation ~ optional(Newline)) ~ zeroOrMore(Modifier) ~ TmplDef
+ PackageObject |
+ Import |
+ zeroOrMore(Annotation ~ optional(Newline)) ~ zeroOrMore(Modifier) ~ TmplDef
}
rule { oneOrMore(TopStat).separatedBy(Semis) }
}
diff --git a/scalaParser/src/main/scala/scalaParser/syntax/Identifiers.scala b/scalaParser/src/main/scala/scalaParser/syntax/Identifiers.scala
index 78fdba4..dc12e46 100644
--- a/scalaParser/src/main/scala/scalaParser/syntax/Identifiers.scala
+++ b/scalaParser/src/main/scala/scalaParser/syntax/Identifiers.scala
@@ -6,17 +6,11 @@ import org.parboiled2._
trait Identifiers { self: Parser with Basic =>
object Identifiers{
import Basic._
- def Operator = rule(oneOrMore(OperatorChar))
+ def Operator = rule{!Keywords ~ oneOrMore(OperatorChar)}
- def VarId = rule {
- !(Keywords | WhitespaceChar | Newline | "//" | "/*") ~ Lower ~ IdRest
- }
- def PlainId = rule {
- Upper ~ IdRest |
- VarId |
- !(Keywords | WhitespaceChar | Newline | "//" | "/*") ~ !Keywords ~ Operator
- }
- def Id = rule { PlainId | ("`" ~ oneOrMore(noneOf("`")) ~ "`") }
+ def VarId = rule { !Keywords ~ Lower ~ IdRest }
+ def PlainId = rule { !Keywords ~ Upper ~ IdRest | VarId | Operator }
+ def Id = rule { !Keywords ~ PlainId | ("`" ~ oneOrMore(noneOf("`")) ~ "`") }
def IdRest = rule {
zeroOrMore(zeroOrMore("_") ~ oneOrMore(!"_" ~ Letter | Digit)) ~
optional(oneOrMore("_") ~ optional(Operator))
@@ -24,15 +18,19 @@ trait Identifiers { self: Parser with Basic =>
def AlphabetKeywords = rule {
- "abstract" | "case" | "catch" | "class" | "def" | "do" | "else" | "extends" | "false" | "finally" | "final" | "finally" | "forSome" | "for" | "if" |
- "implicit" | "import" | "lazy" | "match" | "new" | "null" | "object" | "override" | "package" | "private" | "protected" | "return" |
- "sealed" | "super" | "this" | "throw" | "trait" | "try" | "true" | "type" | "val" | "var" | "while" | "with" | "yield" | "_"
+ (
+ "abstract" | "case" | "catch" | "class" | "def" | "do" | "else" | "extends" | "false" | "finally" | "final" | "finally" | "forSome" | "for" | "if" |
+ "implicit" | "import" | "lazy" | "match" | "new" | "null" | "object" | "override" | "package" | "private" | "protected" | "return" |
+ "sealed" | "super" | "this" | "throw" | "trait" | "try" | "true" | "type" | "val" | "var" | "while" | "with" | "yield" | "_"
+ ) ~ !Letter
}
def SymbolicKeywords = rule{
- ":" | ";" | "=>" | "=" | "<-" | "<:" | "<%" | ">:" | "#" | "@" | "\u21d2" | "\u2190"
+ (
+ ":" | ";" | "=>" | "=" | "<-" | "<:" | "<%" | ">:" | "#" | "@" | "\u21d2" | "\u2190"
+ ) ~ !OperatorChar
}
def Keywords = rule {
- AlphabetKeywords ~ !Letter | SymbolicKeywords ~ !OperatorChar
+ AlphabetKeywords | SymbolicKeywords
}
}
diff --git a/scalaParser/src/test/resources/test.scala b/scalaParser/src/test/resources/test.scala
index 3899f47..d8d973e 100644
--- a/scalaParser/src/test/resources/test.scala
+++ b/scalaParser/src/test/resources/test.scala
@@ -1,4 +1,6 @@
object K{
- class RTTypeTest
- private object O
-}
+ omg("lol",
+ 1,
+ 2
+ )
+} \ No newline at end of file