Mercurial > projects > dil
view trunk/src/dil/SyntaxTree.d @ 490:47be6bfe39cd
Refactored code and added new modules.
Added ProtectionDeclaration and changed Parser to make use of it.
Moved class Location to its own module.
Moved some Lexer functions to new module LexerFuncs.
Moved Lexer.getLocation() to struct Token.
Added methods semantic() and error() to class Expression.
Added method error() to class Scope.
author | Aziz K?ksal <aziz.koeksal@gmail.com> |
---|---|
date | Tue, 04 Dec 2007 23:31:20 +0100 |
parents | a7291d3ee9d7 |
children | 9c208925a3d4 |
line wrap: on
line source
/++ Author: Aziz Köksal License: GPL3 +/ module dil.SyntaxTree; 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, ExternDeclaration, 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, AttributeStatement, ExternStatement, // 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, 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, TemplateValueParameter, TemplateTupleParameter, TemplateParameters, TemplateArguments, Linkage, 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 Cast(Class)(Node n) { assert(n !is null); if (n.kind == mixin("NodeKind." ~ typeof(Class).stringof)) return cast(Class)cast(void*)n; return null; } 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; } 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); } }