Mercurial > projects > dil
diff trunk/src/dil/ast/Node.d @ 580:fa6d3c52757d
Moved SyntaxTree.d to new package 'ast'.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Sat, 05 Jan 2008 17:49:55 +0100 |
parents | trunk/src/dil/SyntaxTree.d@c9579ea87228 |
children | 39fac5531b85 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/dil/ast/Node.d Sat Jan 05 17:49:55 2008 +0100 @@ -0,0 +1,289 @@ +/++ + Author: Aziz Köksal + License: GPL3 ++/ +module dil.ast.Node; +import dil.Token; +import common; + +enum NodeCategory +{ + Declaration, + Statement, + Expression, + Type, + Other +} + +enum NodeKind +{ + // Declarations: + Declarations, + EmptyDeclaration, + IllegalDeclaration, + ModuleDeclaration, + ImportDeclaration, + AliasDeclaration, + TypedefDeclaration, + EnumDeclaration, + ClassDeclaration, + InterfaceDeclaration, + StructDeclaration, + UnionDeclaration, + ConstructorDeclaration, + StaticConstructorDeclaration, + DestructorDeclaration, + StaticDestructorDeclaration, + FunctionDeclaration, + VariableDeclaration, + InvariantDeclaration, + UnittestDeclaration, + DebugDeclaration, + VersionDeclaration, + StaticIfDeclaration, + StaticAssertDeclaration, + TemplateDeclaration, + NewDeclaration, + DeleteDeclaration, + AttributeDeclaration, + ProtectionDeclaration, + StorageClassDeclaration, + LinkageDeclaration, + AlignDeclaration, + PragmaDeclaration, + MixinDeclaration, + + // Statements: + Statements, + IllegalStatement, + EmptyStatement, + ScopeStatement, + LabeledStatement, + ExpressionStatement, + DeclarationStatement, + IfStatement, + ConditionalStatement, + WhileStatement, + DoWhileStatement, + ForStatement, + ForeachStatement, + ForeachRangeStatement, // D2.0 + SwitchStatement, + CaseStatement, + DefaultStatement, + ContinueStatement, + BreakStatement, + ReturnStatement, + GotoStatement, + WithStatement, + SynchronizedStatement, + TryStatement, + CatchBody, + FinallyBody, + ScopeGuardStatement, + ThrowStatement, + VolatileStatement, + AsmStatement, + AsmInstruction, + AsmAlignStatement, + IllegalAsmInstruction, + PragmaStatement, + MixinStatement, + StaticIfStatement, + StaticAssertStatement, + DebugStatement, + VersionStatement, + + // Expressions: + 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, + SpecialTokenExpression, + DotExpression, + DotListExpression, + TemplateInstanceExpression, + ThisExpression, + SuperExpression, + NullExpression, + DollarExpression, + BoolExpression, + IntExpression, + RealExpression, + ComplexExpression, + CharExpression, + StringExpression, + ArrayLiteralExpression, + AArrayLiteralExpression, + AssertExpression, + MixinExpression, + ImportExpression, + TypeofExpression, + TypeDotIdExpression, + TypeidExpression, + IsExpression, + FunctionLiteralExpression, + TraitsExpression, // D2.0 + VoidInitializer, + ArrayInitializer, + StructInitializer, + AsmTypeExpression, + AsmOffsetExpression, + AsmSegExpression, + AsmPostBracketExpression, + AsmBracketExpression, + AsmLocalSizeExpression, + AsmRegisterExpression, + + // Types: + IntegralType, + UndefinedType, + DotType, + DotListType, + IdentifierType, + TypeofType, + TemplateInstanceType, + PointerType, + ArrayType, + FunctionType, + DelegateType, + CFuncPointerType, + ConstType, // D2.0 + InvariantType, // D2.0 + + // Other: + FunctionBody, + Parameter, + Parameters, + BaseClass, + TemplateAliasParameter, + TemplateTypeParameter, + TemplateThisParameter, // D2.0 + TemplateValueParameter, + TemplateTupleParameter, + TemplateParameters, + TemplateArguments, + EnumMember, +} + +/// This string is mixed into the constructor of a class that inherits from Node. +const string set_kind = `this.kind = mixin("NodeKind." ~ typeof(this).stringof);`; + +Class TryCast(Class)(Node n) +{ + assert(n !is null); + if (n.kind == mixin("NodeKind." ~ typeof(Class).stringof)) + return cast(Class)cast(void*)n; + return null; +} + +Class CastTo(Class)(Node n) +{ + assert(n !is null && n.kind == mixin("NodeKind." ~ typeof(Class).stringof)); + return cast(Class)cast(void*)n; +} + +class Node +{ + NodeCategory category; + NodeKind kind; + Node[] children; + Token* begin, end; + + this(NodeCategory category) + { + this.category = category; + } + + void setTokens(Token* begin, Token* end) + { + this.begin = begin; + this.end = end; + } + + Class setToks(Class)(Class node) + { + node.setTokens(this.begin, this.end); + return node; + } + + void addChild(Node child) + { + assert(child !is null, "failed in " ~ this.classinfo.name); + this.children ~= child; + } + + void addOptChild(Node child) + { + child is null || addChild(child); + } + + void addChildren(Node[] children) + { + assert(children !is null && delegate{ + foreach (child; children) + if (child is null) + return false; + return true; }(), + "failed in " ~ this.classinfo.name + ); + this.children ~= children; + } + + void addOptChildren(Node[] children) + { + children is null || addChildren(children); + } +}