summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSom Snytt <som.snytt@gmail.com>2013-10-17 16:41:18 -0700
committerSom Snytt <som.snytt@gmail.com>2013-11-08 11:09:20 -0800
commitef273e4790528f267655fff147c712941cc7ce1a (patch)
treebbf7c4199606fa271833928506d2b0bb4044ab9b
parent19e68d6974c3067814b818b4dfd7d15461a9ef29 (diff)
downloadscala-ef273e4790528f267655fff147c712941cc7ce1a.tar.gz
scala-ef273e4790528f267655fff147c712941cc7ce1a.tar.bz2
scala-ef273e4790528f267655fff147c712941cc7ce1a.zip
Parser stack reduction discussion
Check files
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala27
-rw-r--r--test/files/neg/t1878.check4
-rw-r--r--test/files/neg/t3189.check2
-rw-r--r--test/files/neg/t5702-neg-bad-and-wild.check14
-rw-r--r--test/files/neg/t5702-neg-bad-xbrace.check4
-rw-r--r--test/files/neg/t5702-neg-ugly-xbrace.check2
6 files changed, 27 insertions, 26 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
index 24e35a9fd8..fa3302b125 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
@@ -759,7 +759,7 @@ self =>
var opstack: List[OpInfo] = Nil
- @deprecated("Use `scala.reflect.internal.Precdence`", "2.11.0")
+ @deprecated("Use `scala.reflect.internal.Precedence`", "2.11.0")
def precedence(operator: Name): Int = Precedence(operator.toString).level
private def opHead = opstack.head
@@ -1825,7 +1825,6 @@ self =>
val top = simplePattern(badPattern3)
val base = opstack
// See SI-3189, SI-4832 for motivation. Cf SI-3480 for counter-motivation.
- // TODO: dredge out the remnants of regexp patterns.
def peekaheadDelim() = {
def isCloseDelim = in.token match {
case RBRACE => isXML
@@ -1850,24 +1849,26 @@ self =>
def badPattern3(): Tree = {
def isComma = in.token == COMMA
- def isDelimeter = in.token == RPAREN || in.token == RBRACE
- def isCommaOrDelimeter = isComma || isDelimeter
+ def isDelimiter = in.token == RPAREN || in.token == RBRACE
+ def isCommaOrDelimiter = isComma || isDelimiter
val (isUnderscore, isStar) = opstack match {
case OpInfo(Ident(nme.WILDCARD), nme.STAR, _) :: _ => (true, true)
case OpInfo(_, nme.STAR, _) :: _ => (false, true)
case _ => (false, false)
}
- def isSeqPatternClose = isUnderscore && isStar && isSequenceOK && isDelimeter
- val msg = (isUnderscore, isStar, isSequenceOK) match {
- case (true, true, true) if isComma => "bad use of _* (a sequence pattern must be the last pattern)"
- case (true, true, true) if isDelimeter => "bad brace or paren after _*"
- case (true, true, false) if isDelimeter => "bad use of _* (sequence pattern not allowed)"
- case (false, true, true) if isDelimeter => "use _* to match a sequence"
- case (false, true, true) if isCommaOrDelimeter => "trailing * is not a valid pattern"
- case _ => "illegal start of simple pattern"
+ def isSeqPatternClose = isUnderscore && isStar && isSequenceOK && isDelimiter
+ val preamble = "bad simple pattern:"
+ val subtext = (isUnderscore, isStar, isSequenceOK) match {
+ case (true, true, true) if isComma => "bad use of _* (a sequence pattern must be the last pattern)"
+ case (true, true, true) if isDelimiter => "bad brace or paren after _*"
+ case (true, true, false) if isDelimiter => "bad use of _* (sequence pattern not allowed)"
+ case (false, true, true) if isDelimiter => "use _* to match a sequence"
+ case (false, true, _) if isCommaOrDelimiter => "trailing * is not a valid pattern"
+ case _ => null
}
+ val msg = if (subtext != null) s"$preamble $subtext" else "illegal start of simple pattern"
// better recovery if don't skip delims of patterns
- val skip = !isCommaOrDelimeter || isSeqPatternClose
+ val skip = !isCommaOrDelimiter || isSeqPatternClose
syntaxErrorOrIncompleteAnd(msg, skip)(errorPatternTree)
}
diff --git a/test/files/neg/t1878.check b/test/files/neg/t1878.check
index ac2071c3d8..5814375515 100644
--- a/test/files/neg/t1878.check
+++ b/test/files/neg/t1878.check
@@ -1,7 +1,7 @@
-t1878.scala:3: error: bad use of _* (a sequence pattern must be the last pattern)
+t1878.scala:3: error: bad simple pattern: bad use of _* (a sequence pattern must be the last pattern)
val err1 = "" match { case Seq(f @ _*, ',') => f }
^
-t1878.scala:9: error: bad use of _* (a sequence pattern must be the last pattern)
+t1878.scala:9: error: bad simple pattern: bad use of _* (a sequence pattern must be the last pattern)
val List(List(_*, arg2), _) = List(List(1,2,3), List(4,5,6))
^
two errors found
diff --git a/test/files/neg/t3189.check b/test/files/neg/t3189.check
index 3913c526a2..122af56474 100644
--- a/test/files/neg/t3189.check
+++ b/test/files/neg/t3189.check
@@ -1,4 +1,4 @@
-t3189.scala:2: error: use _* to match a sequence
+t3189.scala:2: error: bad simple pattern: use _* to match a sequence
val Array(a,b*) = ("": Any)
^
one error found
diff --git a/test/files/neg/t5702-neg-bad-and-wild.check b/test/files/neg/t5702-neg-bad-and-wild.check
index 3970c755bd..ff9e5e5703 100644
--- a/test/files/neg/t5702-neg-bad-and-wild.check
+++ b/test/files/neg/t5702-neg-bad-and-wild.check
@@ -1,4 +1,4 @@
-t5702-neg-bad-and-wild.scala:10: error: bad use of _* (a sequence pattern must be the last pattern)
+t5702-neg-bad-and-wild.scala:10: error: bad simple pattern: bad use of _* (a sequence pattern must be the last pattern)
case List(1, _*,) => // bad use of _* (a sequence pattern must be the last pattern)
^
t5702-neg-bad-and-wild.scala:10: error: illegal start of simple pattern
@@ -7,22 +7,22 @@ t5702-neg-bad-and-wild.scala:10: error: illegal start of simple pattern
t5702-neg-bad-and-wild.scala:12: error: illegal start of simple pattern
case List(1, _*3,) => // illegal start of simple pattern
^
-t5702-neg-bad-and-wild.scala:14: error: use _* to match a sequence
+t5702-neg-bad-and-wild.scala:14: error: bad simple pattern: use _* to match a sequence
case List(1, x*) => // use _* to match a sequence
^
-t5702-neg-bad-and-wild.scala:15: error: trailing * is not a valid pattern
+t5702-neg-bad-and-wild.scala:15: error: bad simple pattern: trailing * is not a valid pattern
case List(x*, 1) => // trailing * is not a valid pattern
^
-t5702-neg-bad-and-wild.scala:16: error: illegal start of simple pattern
+t5702-neg-bad-and-wild.scala:16: error: bad simple pattern: trailing * is not a valid pattern
case (1, x*) => // trailing * is not a valid pattern
^
-t5702-neg-bad-and-wild.scala:17: error: bad use of _* (sequence pattern not allowed)
+t5702-neg-bad-and-wild.scala:17: error: bad simple pattern: bad use of _* (sequence pattern not allowed)
case (1, x@_*) => // bad use of _* (sequence pattern not allowed)
^
-t5702-neg-bad-and-wild.scala:23: error: bad use of _* (a sequence pattern must be the last pattern)
+t5702-neg-bad-and-wild.scala:23: error: bad simple pattern: bad use of _* (a sequence pattern must be the last pattern)
val K(ns @ _*, x) = k // bad use of _* (a sequence pattern must be the last pattern)
^
-t5702-neg-bad-and-wild.scala:24: error: bad use of _* (sequence pattern not allowed)
+t5702-neg-bad-and-wild.scala:24: error: bad simple pattern: bad use of _* (sequence pattern not allowed)
val (b, _ * ) = Pair(5,6) // bad use of _* (sequence pattern not allowed)
^
9 errors found
diff --git a/test/files/neg/t5702-neg-bad-xbrace.check b/test/files/neg/t5702-neg-bad-xbrace.check
index d88638aee9..9240abea44 100644
--- a/test/files/neg/t5702-neg-bad-xbrace.check
+++ b/test/files/neg/t5702-neg-bad-xbrace.check
@@ -1,7 +1,7 @@
-t5702-neg-bad-xbrace.scala:19: error: bad brace or paren after _*
+t5702-neg-bad-xbrace.scala:19: error: bad simple pattern: bad brace or paren after _*
case <year>{_*)}</year> => y
^
-t5702-neg-bad-xbrace.scala:28: error: bad brace or paren after _*
+t5702-neg-bad-xbrace.scala:28: error: bad simple pattern: bad brace or paren after _*
val <top>{a, z@_*)}</top> = xml
^
two errors found
diff --git a/test/files/neg/t5702-neg-ugly-xbrace.check b/test/files/neg/t5702-neg-ugly-xbrace.check
index 7d80bbf6be..cdd2438b0e 100644
--- a/test/files/neg/t5702-neg-ugly-xbrace.check
+++ b/test/files/neg/t5702-neg-ugly-xbrace.check
@@ -1,4 +1,4 @@
-t5702-neg-ugly-xbrace.scala:11: error: bad brace or paren after _*
+t5702-neg-ugly-xbrace.scala:11: error: bad simple pattern: bad brace or paren after _*
val <top>{a, z@_*)</top> = xml
^
t5702-neg-ugly-xbrace.scala:12: error: Missing closing brace `}' assumed here