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);
  }
}