From ef273e4790528f267655fff147c712941cc7ce1a Mon Sep 17 00:00:00 2001 From: Som Snytt Date: Thu, 17 Oct 2013 16:41:18 -0700 Subject: Parser stack reduction discussion Check files --- .../scala/tools/nsc/ast/parser/Parsers.scala | 27 +++++++++++----------- test/files/neg/t1878.check | 4 ++-- test/files/neg/t3189.check | 2 +- test/files/neg/t5702-neg-bad-and-wild.check | 14 +++++------ test/files/neg/t5702-neg-bad-xbrace.check | 4 ++-- test/files/neg/t5702-neg-ugly-xbrace.check | 2 +- 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 {_*)} => 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 {a, z@_*)} = 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 {a, z@_*) = xml ^ t5702-neg-ugly-xbrace.scala:12: error: Missing closing brace `}' assumed here -- cgit v1.2.3