# HG changeset patch # User aziz # Date 1183805460 0 # Node ID aec3b16144feb6af7531656183c13c5c1ec7d7f4 # Parent 1a83e5070a844cf4f81219a3253839acb383e8bb - Added code for parsing (Expression) in parsePrimaryExpression(). Added missing break statement. - Added method parseType(). - Added missing break statement in parseBasicType(). - Added method parseDeclaratorSuffix() and parseDeclarator(). diff -r 1a83e5070a84 -r aec3b16144fe trunk/src/Parser.d --- a/trunk/src/Parser.d Fri Jul 06 20:28:00 2007 +0000 +++ b/trunk/src/Parser.d Sat Jul 07 10:51:00 2007 +0000 @@ -548,6 +548,9 @@ // e = new IsExpression(); break; case T.LParen: + nT(); + e = parseExpression(); + require(T.RParen); break; // BasicType . Identifier case T.Void, T.Char, T.Wchar, T.Dchar, T.Bool, @@ -570,6 +573,7 @@ errorIfNot(T.Identifier); e = new TypeDotIdExpression(type, ident); + break; default: // error(); } @@ -603,6 +607,11 @@ return es; } + Type parseType() + { + return parseDeclaratorSuffix(parseBasicType2(parseBasicType())); + } + Type parseBasicType() { Type t; @@ -659,6 +668,7 @@ { case T.Mul: t = new PointerType(t); + nT(); break; case T.LBracket: nT(); @@ -672,21 +682,66 @@ t = new ArrayType(t, parseExpression()); require(T.RBracket); } + break; + case T.Function, T.Delegate: + TOK tok = token.type; + nT(); + auto args = parseParameters(); +// if (tok == T.Function) +// t = new FunctionType(); +// else +// t = new DelegateType(); + break; + default: + return t; + } + } + assert(0); + } + + Type parseDeclaratorSuffix(Type t) + { + while (1) + { + switch (token.type) + { + case T.LBracket: + nT(); + if (token.type == T.RBracket) + { + t = new ArrayType(t, null); + nT(); + } + else + { + t = new ArrayType(t, parseExpression()); + require(T.RBracket); + } continue; - case T.Function, T.Delegate: - TOK tok = token.type; - nT(); - auto args = parseParameters(); -// if (tok == T.Function) -// t = new FunctionType(); -// else -// t = new DelegateType(); - default: - return t; + case T.LParen: + auto params = parseParameters(); + // new FunctionType(params); + break; } + break; + } + return t; + } + + Type parseDeclarator(ref string ident) + { + auto t = parseBasicType2(parseBasicType()); + + if (token.type == T.Identifier) + { + ident = token.srcText; nT(); } - assert(0); + else + errorIfNot(T.Identifier); + + t = parseDeclaratorSuffix(t); + return t; } Argument[] parseParameters()