changeset 276:d6b2f7616ca5

- 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.
author aziz
date Mon, 06 Aug 2007 15:01:02 +0000
parents e8de572e4d01
children 38a68e534a3b
files trunk/src/Expressions.d trunk/src/SyntaxTree.d
diffstat 2 files changed, 326 insertions(+), 56 deletions(-) [+]
line wrap: on
line diff
--- 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;
   }
--- 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)