Mercurial > projects > dil
diff trunk/src/Parser.d @ 154:0e7cefb15e43
- Renamed IdentifierListExpression to DotListExpression, and parseIdentifierListExpression() to parseDotListExpression().
- parseDotListExpression() parses NewExpression items as well.
- Commented out code in parsePostExpression().
- Commented out code in parsePrimaryExpression() and replaced with a call to parseDotListExpression().
- Fix: parseArguments() was called with T.LParen instead of T.RParen.
- Removed unused class DotExpression.
- Added class DotListExpression.
author | aziz |
---|---|
date | Fri, 13 Jul 2007 09:43:00 +0000 |
parents | 66790fc2c0a2 |
children | cd4394ef4b59 |
line wrap: on
line diff
--- a/trunk/src/Parser.d Thu Jul 12 22:30:01 2007 +0000 +++ b/trunk/src/Parser.d Fri Jul 13 09:43:00 2007 +0000 @@ -912,19 +912,23 @@ return new DeleteDeclaration(parameters, decls); } - // IdentifierListExpression: - // .IdentifierList - // IdentifierList - // Typeof - // Typeof . IdentifierList - // IdentifierList: - // Identifier - // Identifier . IdentifierList - // TemplateInstance - // TemplateInstance . IdentifierList - // TemplateInstance: - // Identifier !( TemplateArgumentList ) - IdentifierListExpression parseIdentifierListExpression() + /+ + DotListExpression: + . DotListItems + DotListItems + Typeof + Typeof . DotListItems + DotListItems: + DotListItem + DotListItem . DotListItems + DotListItem: + Identifier + TemplateInstance + NewExpression + TemplateInstance: + Identifier !( TemplateArgumentList ) + +/ + DotListExpression parseDotListExpression() { Expression[] identList; if (token.type == T.Dot) @@ -939,7 +943,7 @@ require(T.RParen); identList ~= new TypeofExpression(type); if (token.type != T.Dot) - return new IdentifierListExpression(identList); + goto Lreturn; nT(); } @@ -956,15 +960,37 @@ else // Identifier identList ~= new IdentifierExpression(ident); + LnewExpressionLoop: if (token.type != T.Dot) break; - nT(); + nT(); // Skip dot. + + if (token.type == T.New) + { + identList ~= parseNewExpression(); + goto LnewExpressionLoop; + } } - - return new IdentifierListExpression(identList); + Lreturn: + return new DotListExpression(identList); } - IdentifierListType parseIdentifierListType() + /+ + DotListType: + . TypeItems + TypeItems + Typeof + Typeof . TypeItems + TypeItems: + TypeItem + TypeItem . TypeItems + TypeItem: + Identifier + TemplateInstance + TemplateInstance: + Identifier !( TemplateArgumentList ) + +/ + DotListType parseDotListType() { Type[] identList; if (token.type == T.Dot) @@ -978,16 +1004,17 @@ identList ~= new TypeofType(parseExpression()); require(T.RParen); if (token.type != T.Dot) - return new IdentifierListType(identList); + goto Lreturn; nT(); } while (1) { string ident = requireIdentifier(); - Token next; - lx.peek(next); - if (token.type == T.Not && next.type == T.LParen) // Identifier !( TemplateArguments ) + // NB.: Currently Types can't be followed by "!=" so we don't need to peek for "(" when parsing TemplateInstances. + /+Token next; + lx.peek(next);+/ + if (token.type == T.Not/+ && next.type == T.LParen+/) // Identifier !( TemplateArguments ) { nT(); // Skip !. identList ~= new TemplateInstanceType(ident, parseTemplateArguments()); @@ -999,8 +1026,8 @@ break; nT(); } - - return new IdentifierListType(identList); + Lreturn: + return new DotListType(identList); } /* @@ -1323,7 +1350,7 @@ nT(); e = new CompExpression(parseUnaryExpression()); break; case T.New: - e = parseNewExpression(null); + e = parseNewExpression(); break; case T.Delete: nT(); @@ -1357,6 +1384,8 @@ { switch (token.type) { +/* +// Commented out because parseDotListExpression() handles this. case T.Dot: nT(); if (token.type == T.Identifier) @@ -1381,6 +1410,7 @@ else expected(T.Identifier); continue; +*/ case T.PlusPlus: e = new PostIncrExpression(e); break; @@ -1388,7 +1418,7 @@ e = new PostDecrExpression(e); break; case T.LParen: - e = new CallExpression(e, parseArguments(T.LParen)); + e = new CallExpression(e, parseArguments(T.RParen)); continue; case T.LBracket: // parse Slice- and IndexExpression @@ -1430,6 +1460,8 @@ Expression e; switch (token.type) { +/* +// Commented out because parseDotListExpression() handles this. case T.Identifier: string ident = token.identifier; nT(); @@ -1447,6 +1479,10 @@ nT(); e = new IdentifierExpression("."); break; +*/ + case T.Identifier, T.Dot, T.Typeof: + e = parseDotListExpression(); + break; case T.This: nT(); e = new ThisExpression(); @@ -1605,6 +1641,8 @@ require(T.RParen); e = new TypeidExpression(type); break; +/* +// Commented out because parseDotListExpression() handles this. case T.Typeof: requireNext(T.LParen); auto type = new TypeofType(parseExpression()); @@ -1618,6 +1656,7 @@ else // typeof ( Expression ) e = new TypeofExpression(type); break; +*/ case T.Is: requireNext(T.LParen); @@ -1696,7 +1735,7 @@ return e; } - Expression parseNewExpression(Expression e) + Expression parseNewExpression(/*Expression e*/) { assert(token.type == T.New); nT(); // Skip new keyword. @@ -1720,7 +1759,7 @@ require(T.LBrace); auto decls = parseDeclarationDefinitions(); require(T.RBrace); - return new NewAnonClassExpression(e, newArguments, bases, ctorArguments, decls); + return new NewAnonClassExpression(/*e, */newArguments, bases, ctorArguments, decls); } // NewExpression: @@ -1733,7 +1772,7 @@ { ctorArguments = parseArguments(T.RParen); } - return new NewExpression(e, newArguments, type, ctorArguments); + return new NewExpression(/*e, */newArguments, type, ctorArguments); } Type parseType() @@ -1782,7 +1821,7 @@ goto Lident; +/ case T.Identifier, T.Typeof, T.Dot: - t = parseIdentifierListType(); + t = parseDotListType(); break; default: // TODO: issue error msg.