# HG changeset patch # User aziz # Date 1186412462 0 # Node ID d6b2f7616ca54f3fce6e57f04a828c53737cee10 # Parent e8de572e4d010d66bd8e3460d7279fc6ae458075 - Added enum NodeKind to classify different nodes in the AST. Correspondingly added member 'kind' to class Node. - Added mixin(set_kind) statement to every constructor that inherits from Expression. diff -r e8de572e4d01 -r d6b2f7616ca5 trunk/src/Expressions.d --- a/trunk/src/Expressions.d Mon Aug 06 14:00:03 2007 +0000 +++ b/trunk/src/Expressions.d Mon Aug 06 15:01:02 2007 +0000 @@ -19,7 +19,10 @@ class EmptyExpression : Expression { - + this() + { + mixin(set_kind); + } } class BinaryExpression : Expression @@ -28,6 +31,7 @@ Token* tok; this(Expression left, Expression right, Token* tok) { + mixin(set_kind); this.left = left; this.right = right; this.tok = tok; @@ -39,238 +43,359 @@ Expression condition; this(Expression condition, Expression left, Expression right) { + super(left, right, null); + mixin(set_kind); this.condition = condition; - super(left, right, null); } } class CommaExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class OrOrExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class AndAndExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class OrExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class XorExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class AndExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class CmpExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class EqualExpression : CmpExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class IdentityExpression : CmpExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class RelExpression : CmpExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class InExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class LShiftExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class RShiftExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class URShiftExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class PlusExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class MinusExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class CatExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class MulExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class DivExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class ModExpression : BinaryExpression { this(Expression left, Expression right, Token* tok) - { super(left, right, tok); } + { + super(left, right, tok); + mixin(set_kind); + } } class AssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class LShiftAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class RShiftAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class URShiftAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class OrAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class AndAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class PlusAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class MinusAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class DivAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class MulAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class ModAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class XorAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class CatAssignExpression : BinaryExpression { this(Expression left, Expression right) - { super(left, right, null); } + { + super(left, right, null); + mixin(set_kind); + } } class UnaryExpression : Expression { Expression e; this(Expression e) - { this.e = e; } + { + this.e = e; + mixin(set_kind); + } } class AddressExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class PreIncrExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class PreDecrExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class PostIncrExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class PostDecrExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class DerefExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class SignExpression : UnaryExpression @@ -278,19 +403,26 @@ this(Expression e) { super(e); + mixin(set_kind); } } class NotExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class CompExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } /+ class DotIdExpression : UnaryExpression @@ -322,6 +454,7 @@ this(Expression e, DotListExpression dotList) { super(e); + mixin(set_kind); this.dotList = dotList; } } @@ -332,6 +465,7 @@ this(Expression e, Expression[] args) { super(e); + mixin(set_kind); this.args = args; } } @@ -344,6 +478,7 @@ this(/*Expression e, */Expression[] newArgs, Type type, Expression[] ctorArgs) { /*super(e);*/ + mixin(set_kind); this.newArgs = newArgs; this.type = type; this.ctorArgs = ctorArgs; @@ -359,6 +494,7 @@ this(/*Expression e, */Expression[] newArgs, BaseClass[] bases, Expression[] ctorArgs, Declaration[] decls) { /*super(e);*/ + mixin(set_kind); this.newArgs = newArgs; this.bases = bases; this.ctorArgs = ctorArgs; @@ -369,7 +505,10 @@ class DeleteExpression : UnaryExpression { this(Expression e) - { super(e); } + { + super(e); + mixin(set_kind); + } } class CastExpression : UnaryExpression @@ -378,6 +517,7 @@ this(Expression e, Type type) { super(e); + mixin(set_kind); this.type = type; } } @@ -388,6 +528,7 @@ this(Expression e, Expression[] args) { super(e); + mixin(set_kind); this.args = args; } } @@ -398,6 +539,7 @@ this(Expression e, Expression left, Expression right) { super(e); + mixin(set_kind); this.left = left; this.right = right; } @@ -415,6 +557,7 @@ Token* identifier; this(Token* identifier) { + mixin(set_kind); this.identifier = identifier; } } @@ -433,6 +576,7 @@ Expression[] items; this(Expression[] items) { + mixin(set_kind); this.items = items; } } @@ -443,6 +587,7 @@ TemplateArguments targs; this(Token* ident, TemplateArguments targs) { + mixin(set_kind); this.ident = ident; this.targs = targs; } @@ -451,31 +596,41 @@ class ThisExpression : Expression { this() - {} + { + mixin(set_kind); + } } class SuperExpression : Expression { this() - {} + { + mixin(set_kind); + } } class NullExpression : Expression { this() - {} + { + mixin(set_kind); + } } class DollarExpression : Expression { this() - {} + { + mixin(set_kind); + } } class BoolExpression : Expression { this() - {} + { + mixin(set_kind); + } } class IntNumberExpression : Expression @@ -484,6 +639,7 @@ ulong number; this(TOK type, ulong number) { + mixin(set_kind); this.number = number; this.type = type; } @@ -495,6 +651,7 @@ real number; this(TOK type, real number) { + mixin(set_kind); this.number = number; this.type = type; } @@ -503,21 +660,29 @@ class CharLiteralExpression : Expression { this() - {} + { + mixin(set_kind); + } } class StringLiteralsExpression : Expression { - Token*[] strLiterals; - this(Token*[] strLiterals) - { this.strLiterals = strLiterals; } + Token*[] strings; + this(Token*[] strings) + { + mixin(set_kind); + this.strings = strings; + } } class ArrayLiteralExpression : Expression { Expression[] values; this(Expression[] values) - { this.values = values; } + { + mixin(set_kind); + this.values = values; + } } class AssocArrayLiteralExpression : Expression @@ -525,6 +690,7 @@ Expression[] keys, values; this(Expression[] keys, Expression[] values) { + mixin(set_kind); this.keys = keys; this.values = values; } @@ -535,6 +701,7 @@ Expression expr, msg; this(Expression expr, Expression msg) { + mixin(set_kind); this.expr = expr; this.msg = msg; } @@ -545,6 +712,7 @@ Expression expr; this(Expression expr) { + mixin(set_kind); this.expr = expr; } } @@ -554,6 +722,7 @@ Expression expr; this(Expression expr) { + mixin(set_kind); this.expr = expr; } } @@ -563,6 +732,7 @@ Type type; this(Type type) { + mixin(set_kind); this.type = type; } } @@ -573,6 +743,7 @@ Token* ident; this(Type type, Token* ident) { + mixin(set_kind); this.type = type; this.ident = ident; } @@ -583,6 +754,7 @@ Type type; this(Type type) { + mixin(set_kind); this.type = type; } } @@ -595,6 +767,7 @@ Type specType; this(Type type, Token* ident, Token* opTok, Token* specTok, Type specType) { + mixin(set_kind); this.type = type; this.ident = ident; this.opTok = opTok; @@ -611,6 +784,7 @@ this(FunctionType funcType, FunctionBody funcBody, TOK funcTok = TOK.Invalid) { + mixin(set_kind); this.funcType = funcType; this.funcBody = funcBody; this.funcTok = funcTok; @@ -625,6 +799,7 @@ TemplateArguments targs; this(typeof(ident) ident, typeof(targs) targs) { + mixin(set_kind); this.ident = ident; } } @@ -632,7 +807,10 @@ class VoidInitializer : Expression { - + this() + { + mixin(set_kind); + } } class ArrayInitializer : Expression @@ -641,6 +819,7 @@ Expression[] values; this(Expression[] keys, Expression[] values) { + mixin(set_kind); this.keys = keys; this.values = values; } @@ -652,6 +831,7 @@ Expression[] values; this(Token*[] idents, Expression[] values) { + mixin(set_kind); this.idents = idents; this.values = values; } diff -r e8de572e4d01 -r d6b2f7616ca5 trunk/src/SyntaxTree.d --- a/trunk/src/SyntaxTree.d Mon Aug 06 14:00:03 2007 +0000 +++ b/trunk/src/SyntaxTree.d Mon Aug 06 15:01:02 2007 +0000 @@ -14,9 +14,99 @@ Other } +enum NodeKind +{ + Expression, + EmptyExpression, + BinaryExpression, + CondExpression, + CommaExpression, + OrOrExpression, + AndAndExpression, + OrExpression, + XorExpression, + AndExpression, + CmpExpression, + EqualExpression, + IdentityExpression, + RelExpression, + InExpression, + LShiftExpression, + RShiftExpression, + URShiftExpression, + PlusExpression, + MinusExpression, + CatExpression, + MulExpression, + DivExpression, + ModExpression, + AssignExpression, + LShiftAssignExpression, + RShiftAssignExpression, + URShiftAssignExpression, + OrAssignExpression, + AndAssignExpression, + PlusAssignExpression, + MinusAssignExpression, + DivAssignExpression, + MulAssignExpression, + ModAssignExpression, + XorAssignExpression, + CatAssignExpression, + UnaryExpression, + AddressExpression, + PreIncrExpression, + PreDecrExpression, + PostIncrExpression, + PostDecrExpression, + DerefExpression, + SignExpression, + NotExpression, + CompExpression, + PostDotListExpression, + CallExpression, + NewExpression, + NewAnonClassExpression, + DeleteExpression, + CastExpression, + IndexExpression, + SliceExpression, + PrimaryExpressio, + IdentifierExpression, + DotListExpression, + TemplateInstanceExpression, + ThisExpression, + SuperExpression, + NullExpression, + DollarExpression, + BoolExpression, + IntNumberExpression, + RealNumberExpression, + CharLiteralExpression, + StringLiteralsExpression, + ArrayLiteralExpression, + AssocArrayLiteralExpression, + AssertExpression, + MixinExpression, + ImportExpression, + TypeofExpression, + TypeDotIdExpression, + TypeidExpression, + IsExpression, + FunctionLiteralExpression, + TraitsExpression, // D2.0 + VoidInitializer, + ArrayInitializer, + StructInitializer, +} + +/// This string is mixed in into the constructor of a class that inherits from Node. +const string set_kind = `this.kind = mixin("NodeKind." ~ typeof(this).stringof);`; + class Node { NodeCategory category; + NodeKind kind; Token* begin, end; this(NodeCategory category)