Mercurial > projects > dil
changeset 677:118971211c4c
Fixed parseDeclaratorSuffix().
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Fri, 18 Jan 2008 22:40:06 +0100 |
parents | c4e3a34e40f1 |
children | cedfc67faabf |
files | trunk/src/dil/parser/Parser.d |
diffstat | 1 files changed, 39 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/dil/parser/Parser.d Fri Jan 18 19:28:37 2008 +0100 +++ b/trunk/src/dil/parser/Parser.d Fri Jan 18 22:40:06 2008 +0100 @@ -3588,35 +3588,49 @@ return next.type == tok; } - Type parseDeclaratorSuffix(Type t) + /// Parse the C-style array types after the declarator. + Type parseDeclaratorSuffix(Type lhsType) { - switch (token.type) + // The Type chain should be as follows: + // int[3]* Identifier [][32] + // <- <- -> -. + // ^------------------ยด + // Resulting chain: [][32]*[3]int + Type parseNext() // Nested function required to accomplish this. { - case T.LBracket: - // Type Identifier ArrayType - // ArrayType := [] or [Type] or [Expression..Expression] - do - t = parseArrayType(t); - while (token.type == T.LBracket) - break; -/+ // parsed in parseDeclaration() - case T.LParen: - TemplateParameters tparams; - if (tokenAfterParenIs(T.LParen)) + if (token.type != T.LBracket) + return lhsType; // Break recursion; return Type on the left hand side of the Identifier. + + auto begin = token; + Type t; + nT(); + if (skipped(T.RBracket)) + t = new ArrayType(parseNext()); // [ ] + else { - // ( TemplateParameterList ) ( ParameterList ) - tparams = parseTemplateParameterList(); + bool success; + Type parseAAType() + { + auto type = parseType(); + require(T.RBracket); + return type; + } + auto assocType = try_(&parseAAType, success); + if (success) + t = new ArrayType(parseNext(), assocType); // [ Type ] + else + { + Expression e = parseExpression(), e2; + if (skipped(T.Slice)) + e2 = parseExpression(); + require(T.RBracket); + t = new ArrayType(parseNext(), e, e2); // [ Expression .. Expression ] + } } - - auto params = parseParameterList(); - // ReturnType FunctionName ( ParameterList ) - t = new FunctionType(t, params, tparams); - break; -+/ - default: - break; + set(t, begin); + return t; } - return t; + return parseNext(); } Type parseArrayType(Type t) @@ -3643,8 +3657,8 @@ Expression e = parseExpression(), e2; if (skipped(T.Slice)) e2 = parseExpression(); + require(T.RBracket); t = new ArrayType(t, e, e2); - require(T.RBracket); } } set(t, begin);