summaryrefslogtreecommitdiff
path: root/sources/scalac/ast/parser
diff options
context:
space:
mode:
authorburaq <buraq@epfl.ch>2003-10-09 16:24:01 +0000
committerburaq <buraq@epfl.ch>2003-10-09 16:24:01 +0000
commitd91729e50cffaba90846995c677c107dac9f62d7 (patch)
treedca0a43dbe2fc5c5fba010fb82856f6fdbcd0b66 /sources/scalac/ast/parser
parentdfc5cdeeb776762373603ee3a204b74570811ae6 (diff)
downloadscala-d91729e50cffaba90846995c677c107dac9f62d7.tar.gz
scala-d91729e50cffaba90846995c677c107dac9f62d7.tar.bz2
scala-d91729e50cffaba90846995c677c107dac9f62d7.zip
changed pattern grammar, () is now empty sequen...
changed pattern grammar, () is now empty sequence in patterns
Diffstat (limited to 'sources/scalac/ast/parser')
-rw-r--r--sources/scalac/ast/parser/Parser.java56
1 files changed, 29 insertions, 27 deletions
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index eea0637f47..03231b150f 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -1216,10 +1216,24 @@ public class Parser implements Tokens {
return p;
}
- /* Pattern2 ::= SimplePattern [ '*' | '?' | '+' ]
- * | SimplePattern {Id SimplePattern} // op2 must not be empty
+ /* Pattern2 ::= varid [ @ Pattern3 ]
+ * | Pattern3
*/
Tree pattern2() {
+ Tree p = pattern3();
+ if (s.token == AT && TreeInfo.isVarPattern(p)) {
+ if( !TreeInfo.isWildcardPattern(p) )
+ return make.Bind(s.skipToken(), ((Ident)p).name, pattern3());
+ else
+ return pattern3();
+ }
+ return p;
+ }
+
+ /* Pattern3 ::= SimplePattern [ '*' | '?' | '+' ]
+ * | SimplePattern {Id SimplePattern} // op2 must not be empty
+ */
+ Tree pattern3() {
int base = sp;
Tree top = simplePattern();
if (s.token == IDENTIFIER) {
@@ -1273,11 +1287,11 @@ public class Parser implements Tokens {
return reduceStack(false, base, top, 0, true);
}
- /** SimplePattern ::= varid [ '@' SimplePattern ]
+ /** SimplePattern ::= varid
* | `_'
* | literal
- * | StableId [ArgumentPatterns]
- * | `(' Patterns `)'
+ * | StableId [ `(' [Patterns] `)' ]
+ * | `(' [Patterns] `)'
* | (empty word - nothing)
*/
Tree simplePattern() {
@@ -1292,16 +1306,13 @@ public class Parser implements Tokens {
// else fall through to case THIS
case THIS:
Tree t = stableId();
- switch (t) {
- case Ident(Name name):
- if ((name.isVariable()) && (s.token == AT)) {
- int pos = s.pos;
- s.nextToken();
- return make.Bind(pos, name, simplePattern());
- }
- }
while (s.token == LPAREN) {
- t = make.Apply(s.pos, convertToTypeId(t), argumentPatterns());
+ Tree[] ts = Tree.EMPTY_ARRAY;
+ accept(LPAREN);
+ if (s.token != RPAREN)
+ ts = patterns();
+ accept(RPAREN);
+ t = make.Apply(s.pos, convertToTypeId(t), ts);
}
return t;
case USCORE:
@@ -1320,8 +1331,10 @@ public class Parser implements Tokens {
case LPAREN:
int p = s.pos;
s.nextToken();
- Tree[] ts = patterns();
- Tree t;
+ Tree[] ts = Tree.EMPTY_ARRAY;
+ if( s.token!= RPAREN )
+ ts = patterns();
+ Tree t;
if (ts.length == 1)
t = ts[0];
else {
@@ -1335,17 +1348,6 @@ public class Parser implements Tokens {
}
}
- /** ArgumentPatterns ::= `(' [Patterns] `)'
- */
- Tree[] argumentPatterns() {
- Tree[] ts = Tree.EMPTY_ARRAY;
- accept(LPAREN);
- if (s.token != RPAREN)
- ts = patterns();
- accept(RPAREN);
- return ts;
- }
-
////////// MODIFIERS ////////////////////////////////////////////////////////////
/** Modifiers ::= {Modifier}