Mercurial > projects > dil
changeset 98:aec3b16144fe
- 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().
author | aziz |
---|---|
date | Sat, 07 Jul 2007 10:51:00 +0000 |
parents | 1a83e5070a84 |
children | 6b8c248f5911 |
files | trunk/src/Parser.d |
diffstat | 1 files changed, 66 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- 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()