Closer to having the AST classes completed

This commit is contained in:
Hackerpilot 2013-07-27 03:12:14 +00:00
parent 830bd82ae3
commit 4a9c8699a5
2 changed files with 367 additions and 239 deletions

View File

@ -125,7 +125,6 @@ public:
/** */ void visit(ImportBindings importBindings) { importBindings.accept(this); }
/** */ void visit(ImportDeclaration importDeclaration) { importDeclaration.accept(this); }
/** */ void visit(ImportExpression importExpression) { importExpression.accept(this); }
/** */ void visit(ImportList importList) { importList.accept(this); }
/** */ void visit(IndexExpression indexExpression) { indexExpression.accept(this); }
/** */ void visit(InExpression inExpression) { inExpression.accept(this); }
/** */ void visit(InStatement inStatement) { inStatement.accept(this); }
@ -1171,7 +1170,11 @@ public:
class ForeachStatement : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(foreachTypeList, low, high,
statementNoCaseNoDefault));
}
/** */ TokenType foreachType;
/** */ ForeachTypeList foreachTypeList;
/** */ Expression low;
@ -1183,7 +1186,10 @@ public:
class ForeachType : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(type, identifier));
}
/** */ TokenType[] typeConstructors;
/** */ Type type;
/** */ Token identifier;
@ -1193,7 +1199,10 @@ public:
class ForeachTypeList : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(items));
}
/** */ ForeachType[] items;
}
@ -1201,7 +1210,10 @@ public:
class FunctionAttribute : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(token, atAttribute));
}
/** */ Token token;
/** */ AtAttribute atAttribute;
}
@ -1226,7 +1238,10 @@ public:
class FunctionCallExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(unaryExpression, arguments, templateArguments));
}
/** */ UnaryExpression unaryExpression;
/** */ TemplateArguments templateArguments;
/** */ Arguments arguments;
@ -1236,7 +1251,10 @@ public:
class FunctionCallStatement : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(functionCallExpression));
}
/** */ FunctionCallExpression functionCallExpression;
}
@ -1246,10 +1264,9 @@ class FunctionDeclaration : ASTNode
public:
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(memberFunctionAttributes, returnType, parameters,
templateParameters, constraint, functionBody));
mixin (visitIfNotNull!(returnType, parameters, templateParameters,
constraint, memberFunctionAttributes, functionBody));
}
/** */ bool hasAuto;
/** */ bool hasRef;
/** */ Type returnType;
@ -1265,7 +1282,11 @@ public:
class FunctionLiteralExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(type, parameters, functionAttributes,
functionBody));
}
/** */ TokenType functionOrDelegate;
/** */ Type type;
/** */ Parameters parameters;
@ -1308,13 +1329,16 @@ public:
class IdentifierOrTemplateChain : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(identifiersOrTemplateInstances));
}
override string toString()
{
string rVal;
bool first = true;
foreach (iot; identifierOrTemplateInstances)
foreach (iot; identifiersOrTemplateInstances)
{
if (!first)
rVal ~= ".";
@ -1323,14 +1347,17 @@ public:
}
return rVal;
}
/** */ IdentifierOrTemplateInstance[] identifierOrTemplateInstances;
/** */ IdentifierOrTemplateInstance[] identifiersOrTemplateInstances;
}
///
class IdentifierOrTemplateInstance : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(identifier, templateInstance));
}
override string toString()
{
@ -1347,7 +1374,10 @@ public:
class IdentityExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(left, right));
}
/** */ bool negated;
mixin BinaryExpressionBody;
}
@ -1356,7 +1386,11 @@ public:
class IfStatement : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(identifier, type, expression, thenStatement,
elseStatement));
}
/** */ Token identifier;
/** */ Type type;
/** */ Expression expression;
@ -1371,14 +1405,16 @@ public:
mixin (DEFAULT_ACCEPT);
/** */ Token left;
/** */ Token right;
/** */ bool hasRight;
}
///
class ImportBindings : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(singleImport, importBinds));
}
/** */ SingleImport singleImport;
/** */ ImportBind[] importBinds;
}
@ -1387,7 +1423,10 @@ public:
class ImportDeclaration : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(singleImports, importBindings));
}
/** */ SingleImport[] singleImports;
/** */ ImportBindings importBindings;
}
@ -1396,25 +1435,21 @@ public:
class ImportExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/** */ AssignExpression assignExpression;
}
///
class ImportList : ASTNode
/+override+/ void accept(ASTVisitor visitor)
{
public:
mixin (DEFAULT_ACCEPT);
/** */ SingleImport singleImport;
/** */ ImportList next;
/** */ ImportBindings bindings;
mixin (visitIfNotNull!(assignExpression));
}
/** */ AssignExpression assignExpression;
}
///
class IndexExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(unaryExpression, argumentList));
}
/** */ UnaryExpression unaryExpression;
/** */ ArgumentList argumentList;
}
@ -1423,16 +1458,22 @@ public:
class InExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/** */ Token operator;
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(left, right));
}
mixin BinaryExpressionBody;
bool negated;
}
///
class InStatement : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(blockStatement));
}
/** */ BlockStatement blockStatement;
}
@ -1440,7 +1481,10 @@ public:
class Initialize : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(statementNoCaseNoDefault));
}
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
}
@ -1448,7 +1492,10 @@ public:
class Initializer : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(nonVoidInitializer));
}
/** */ NonVoidInitializer nonVoidInitializer;
}
@ -1472,7 +1519,10 @@ public:
class Invariant : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(blockStatement));
}
/** */ BlockStatement blockStatement;
}
@ -1480,9 +1530,12 @@ public:
class IsExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(type, identifier, typeSpecialization,
templateParameterList));
}
/** */ Type type;
/** */ AssignExpression assignExpression;
/** */ Token identifier;
/** */ TypeSpecialization typeSpecialization;
/** */ TemplateParameterList templateParameterList;
@ -1493,7 +1546,10 @@ public:
class KeyValuePair : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(key, value));
}
/** */ AssignExpression key;
/** */ AssignExpression value;
}
@ -1502,7 +1558,10 @@ public:
class KeyValuePairs : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(keyValuePairs));
}
/** */ KeyValuePair[] keyValuePairs;
}
@ -1510,7 +1569,10 @@ public:
class LabeledStatement : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(identifier, declarationOrStatement));
}
Token identifier;
/** */ DeclarationOrStatement declarationOrStatement;
}
@ -1519,7 +1581,11 @@ public:
class LambdaExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(identifier, parameters, functionAttributes,
assignExpression));
}
/** */ TokenType functionType;
/** */ Token identifier;
/** */ Parameters parameters;
@ -1531,7 +1597,10 @@ public:
class LastCatch : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(statementNoCaseNoDefault));
}
/** */ StatementNoCaseNoDefault statementNoCaseNoDefault;
}
@ -1548,7 +1617,10 @@ public:
class MemberFunctionAttribute : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(atAttribute));
}
/** */ TokenType tokenType;
/** */ AtAttribute atAttribute;
}
@ -1557,7 +1629,10 @@ public:
class MixinDeclaration : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(mixinExpression, templateMixinExpression));
}
/** */ MixinExpression mixinExpression;
/** */ TemplateMixinExpression templateMixinExpression;
}
@ -1566,7 +1641,10 @@ public:
class MixinExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(assignExpression));
}
/** */ AssignExpression assignExpression;
}
@ -1574,7 +1652,10 @@ public:
class MixinTemplateDeclaration : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(templateDeclaration));
}
/** */ TemplateDeclaration templateDeclaration;
}
@ -1582,8 +1663,11 @@ public:
class MixinTemplateName : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
/** */ bool hasDot;
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(symbol, typeofExpression, identifierOrTemplateChain));
}
/** */ Symbol symbol;
/** */ IdentifierOrTemplateChain identifierOrTemplateChain;
/** */ TypeofExpression typeofExpression;
}
@ -1594,10 +1678,7 @@ class Module : ASTNode
public:
override void accept(ASTVisitor visitor)
{
if (moduleDeclaration !is null)
visitor.visit(moduleDeclaration);
foreach(d; declarations)
visitor.visit(d);
mixin (visitIfNotNull!(moduleDeclaration, declarations));
}
/** */ ModuleDeclaration moduleDeclaration;
/** */ Declaration[] declarations;
@ -1609,7 +1690,7 @@ class ModuleDeclaration : ASTNode
public:
override void accept(ASTVisitor visitor)
{
if (moduleName !is null) visitor.visit(moduleName);
mixin (visitIfNotNull!(moduleName));
}
/** */ IdentifierChain moduleName;
}
@ -1619,7 +1700,10 @@ public:
class MulExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(left, right));
}
/** */ TokenType operator;
mixin BinaryExpressionBody;
}
@ -1628,7 +1712,11 @@ public:
class NewAnonClassExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(allocatorArguments, constructorArguments,
baseClassList, structBody));
}
/** */ Arguments allocatorArguments;
/** */ Arguments constructorArguments;
/** */ BaseClassList baseClassList;
@ -1639,7 +1727,11 @@ public:
class NewExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(newAnonClassExpression, type, arguments,
assignExpression));
}
/** */ Type type;
/** */ NewAnonClassExpression newAnonClassExpression;
/** */ Arguments arguments;
@ -1651,7 +1743,17 @@ public:
class StatementNoCaseNoDefault : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(labeledStatement, blockStatement, ifStatement,
whileStatement, doStatement, forStatement, foreachStatement,
switchStatement, finalSwitchStatement, continueStatement,
breakStatement, returnStatement, gotoStatement, withStatement,
synchronizedStatement, tryStatement, throwStatement,
scopeGuardStatement, asmStatement, conditionalStatement,
staticAssertStatement, versionSpecification, debugSpecification,
functionCallStatement, expressionStatement));
}
/** */ LabeledStatement labeledStatement;
/** */ BlockStatement blockStatement;
/** */ IfStatement ifStatement;
@ -1683,7 +1785,10 @@ public:
class NonVoidInitializer : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(assignExpression, arrayInitializer, structInitializer));
}
/** */ AssignExpression assignExpression;
/** */ ArrayInitializer arrayInitializer;
/** */ StructInitializer structInitializer;
@ -1710,7 +1815,10 @@ public:
class OrExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(left, right));
}
mixin BinaryExpressionBody;
}
@ -1718,7 +1826,10 @@ public:
class OrOrExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(left, right));
}
mixin BinaryExpressionBody;
}
@ -1726,7 +1837,10 @@ public:
class OutStatement : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(parameter, blockStatement));
}
/** */ Token parameter;
/** */ BlockStatement blockStatement;
}
@ -1737,7 +1851,7 @@ class Parameter : ASTNode
public:
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(type, default_));
mixin (visitIfNotNull!(type, name, default_));
}
/** */ TokenType[] parameterAttributes;
/** */ Type type;
@ -1888,7 +2002,10 @@ public:
class ShiftExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(left, right));
}
/** */ TokenType operator;
mixin BinaryExpressionBody;
}
@ -1897,8 +2014,11 @@ public:
class SingleImport : ASTNode
{
public:
mixin (DEFAULT_ACCEPT);
/** */ Token identifier;
override void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(rename, identifierChain));
}
/** */ Token rename;
/** */ IdentifierChain identifierChain;
}
@ -1906,7 +2026,10 @@ public:
class SliceExpression : ExpressionNode
{
public:
mixin (DEFAULT_ACCEPT);
/+override+/ void accept(ASTVisitor visitor)
{
mixin (visitIfNotNull!(unaryExpression, lower, upper));
}
/** */ UnaryExpression unaryExpression;
/** */ AssignExpression lower;
/** */ AssignExpression upper;

View File

@ -2573,7 +2573,7 @@ body {} // six
auto node = new IdentifierOrTemplateChain;
while (moreTokens())
{
node.identifierOrTemplateInstances ~= parseIdentifierOrTemplateInstance();
node.identifiersOrTemplateInstances ~= parseIdentifierOrTemplateInstance();
if (!currentIs(TokenType.dot))
break;
else
@ -2706,7 +2706,6 @@ body {} // six
if (currentIs(TokenType.assign))
{
advance();
node.hasRight = true;
auto id = expect(TokenType.identifier);
if (id is null) return null;
node.right = *id;
@ -2881,7 +2880,10 @@ import core.stdc.stdio, std.string : KeepTerminator;
auto node = new InExpression;
node.left = shift is null ? parseShiftExpression() : shift;
if (currentIs(TokenType.not))
{
node.negated = true;
advance();
}
if (expect(TokenType.in_) is null) return null;
node.right = parseShiftExpression();
return node;
@ -3064,7 +3066,7 @@ invariant() foo();
* Parses an IsExpression
*
* $(GRAMMAR $(RULEDEF isExpression):
* $(LITERAL'is') $(LITERAL '$(LPAREN)') ($(RULE type) $(LITERAL Identifier)? (($(LITERAL ':') | $(LITERAL '==')) $(RULE typeSpecialization) ($(LITERAL ',') $(RULE templateParameterList))?)?) $(LITERAL '$(RPAREN)')
* $(LITERAL'is') $(LITERAL '$(LPAREN)') $(RULE type) $(LITERAL Identifier)? (($(LITERAL ':') | $(LITERAL '==')) $(RULE typeSpecialization) ($(LITERAL ',') $(RULE templateParameterList))?)? $(LITERAL '$(RPAREN)')
* ;)
*/
IsExpression parseIsExpression()
@ -3343,7 +3345,8 @@ invariant() foo();
* Parses a MixinTemplateName
*
* $(GRAMMAR $(RULEDEF mixinTemplateName):
* ($(RULE typeofExpression)? $(LITERAL '.'))? $(RULE identifierOrTemplateChain)
* $(RULE symbol)
* | $(RULE typeofExpression) $(LITERAL '.') $(RULE identifierOrTemplateChain)
* ;)
*/
MixinTemplateName parseMixinTemplateName()
@ -3354,8 +3357,10 @@ invariant() foo();
{
node.typeofExpression = parseTypeofExpression();
expect(TokenType.dot);
}
node.identifierOrTemplateChain = parseIdentifierOrTemplateChain();
}
else
node.symbol = parseSymbol();
return node;
}
@ -4303,8 +4308,8 @@ q{(int a, ...)
auto node = new SingleImport;
if (startsWith(TokenType.identifier, TokenType.assign))
{
node.identifier = advance();
advance();
node.rename = advance();
advance(); // =
}
node.identifierChain = parseIdentifierChain();
return node;