Allow c-style arrays

This commit is contained in:
Callum Anderson 2014-05-19 11:09:54 +10:00
parent 25f0d93b90
commit 9753afcb54
2 changed files with 30 additions and 4 deletions

View File

@ -1176,6 +1176,8 @@ public:
} }
/** */ Token name; /** */ Token name;
/** */ Initializer initializer; /** */ Initializer initializer;
/** */ TypeSuffix[] cstyle;
mixin OpEquals; mixin OpEquals;
} }
@ -2152,6 +2154,8 @@ public:
/** */ Token name; /** */ Token name;
/** */ bool vararg; /** */ bool vararg;
/** */ AssignExpression default_; /** */ AssignExpression default_;
/** */ TypeSuffix[] cstyle;
mixin OpEquals; mixin OpEquals;
} }

View File

@ -1910,11 +1910,20 @@ class ClassFive(A, B) : Super if (someTest()) {}}c;
auto id = expect(tok!"identifier"); auto id = expect(tok!"identifier");
if (id is null) return null; if (id is null) return null;
node.name = *id; node.name = *id;
if (currentIsOneOf(tok!"[", tok!"*")) if (currentIs(tok!"[")) // dmd doesn't accept pointer after identifier
{ {
error("C-style variable declarations are not supported."); warn("C-style array declaration.");
TypeSuffix[] typeSuffixes;
while (moreTokens() && currentIs(tok!"["))
{
auto suffix = parseTypeSuffix();
if (suffix !is null)
typeSuffixes ~= suffix;
else
return null; return null;
} }
node.cstyle = ownArray(typeSuffixes);
}
if (currentIs(tok!"=")) if (currentIs(tok!"="))
{ {
advance(); advance();
@ -3932,7 +3941,7 @@ invariant() foo();
* Parses a Parameter * Parses a Parameter
* *
* $(GRAMMAR $(RULEDEF parameter): * $(GRAMMAR $(RULEDEF parameter):
* $(RULE parameterAttribute)* $(RULE type) ($(LITERAL Identifier)? $(LITERAL '...') | ($(LITERAL Identifier)? ($(LITERAL '=') $(RULE assignExpression))?))? * $(RULE parameterAttribute)* $(RULE type) (($(LITERAL Identifier) $(RULE typeSuffix)*)? $(LITERAL '...') | ($(LITERAL Identifier)? ($(LITERAL '=') $(RULE assignExpression))?))?
* ;) * ;)
*/ */
Parameter parseParameter() Parameter parseParameter()
@ -3964,6 +3973,19 @@ invariant() foo();
advance(); advance();
node.default_ = parseAssignExpression(); node.default_ = parseAssignExpression();
} }
else if (currentIs(tok!"["))
{
TypeSuffix[] typeSuffixes;
while(moreTokens() && currentIs(tok!"["))
{
auto suffix = parseTypeSuffix();
if (suffix !is null)
typeSuffixes ~= suffix;
else
return null;
}
node.cstyle = ownArray(typeSuffixes);
}
} }
else if (currentIs(tok!"...")) else if (currentIs(tok!"..."))
{ {