changeset 537:db7913148b29

Added constructors and semantic() methods.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Tue, 18 Dec 2007 21:23:52 +0100
parents 0781ac288537
children d0d40bcca9c6
files trunk/src/dil/Expressions.d trunk/src/dil/Parser.d
diffstat 2 files changed, 93 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Expressions.d	Tue Dec 18 15:14:41 2007 +0100
+++ b/trunk/src/dil/Expressions.d	Tue Dec 18 21:23:52 2007 +0100
@@ -606,11 +606,32 @@
 
 class SpecialTokenExpression : Expression
 {
-  Token* special;
-  this(Token* special)
+  Token* specialToken;
+  this(Token* specialToken)
   {
     mixin(set_kind);
-    this.special = special;
+    this.specialToken = specialToken;
+  }
+
+  Expression e; /// The expression created in the semantic phase.
+
+  Expression semantic(Scope)
+  {
+    if (type)
+      return e;
+    switch (specialToken.type)
+    {
+    case TOK.LINE, TOK.VERSION:
+      e = new IntExpression(specialToken.uint_, Types.Uint);
+      break;
+    case TOK.FILE, TOK.DATE, TOK.TIME, TOK.TIMESTAMP, TOK.VENDOR:
+      e = new StringExpression(specialToken.str);
+      break;
+    default:
+      assert(0);
+    }
+    type = e.type;
+    return e;
   }
 }
 
@@ -699,14 +720,40 @@
 
 class IntExpression : Expression
 {
-  TOK type;
   ulong number;
-  this(TOK type, ulong number)
+
+  this(ulong number, Type type)
   {
     mixin(set_kind);
     this.number = number;
     this.type = type;
   }
+
+  this(Token* token)
+  {
+    auto type = Types.Int; // Should be most common case.
+    switch (token.type)
+    {
+    // case TOK.Int32:
+    //   type = Types.Int; break;
+    case TOK.Uint32:
+      type = Types.Uint; break;
+    case TOK.Int64:
+      type = Types.Long; break;
+    case TOK.Uint64:
+      type = Types.Ulong; break;
+    default:
+      assert(token.type == TOK.Int32);
+    }
+    this(token.ulong_, type);
+  }
+
+  Expression semantic(Scope scop)
+  {
+    if (type)
+      return this;
+    return this;
+  }
 }
 
 class RealExpression : Expression
@@ -746,20 +793,51 @@
 
 class StringExpression : Expression
 {
-  Token*[] strings;
-  this(Token*[] strings)
+  Token*[] stringTokens;
+  this()
+  { mixin(set_kind); }
+
+  /// Constructor used in parsing phase.
+  this(Token*[] stringTokens)
+  {
+    this.stringTokens = stringTokens;
+  }
+
+  ubyte[] str;   /// The string data.
+  Type charType; /// The character type of the string.
+  // Constructors used in semantic phase.
+  this(ubyte[] str, Type charType)
   {
-    mixin(set_kind);
-    this.strings = strings;
+    this();
+    this.str = str;
+    this.charType = charType;
+    type = new TypeSArray(charType, str.length);
+  }
+
+  this(char[] str)
+  {
+    this(cast(ubyte[])str, Types.Char);
+  }
+  this(wchar[] str)
+  {
+    this(cast(ubyte[])str, Types.Wchar);
+  }
+  this(dchar[] str)
+  {
+    this(cast(ubyte[])str, Types.Dchar);
+  }
+
+  Expression semantic()
+  {
+    if (type)
+      return this;
   }
 
   char[] getString()
   {
     char[] buffer;
-    foreach (strTok; strings)
-    {
-      buffer ~= strTok.str[0..$-1];
-    }
+    foreach (token; stringTokens)
+      buffer ~= token.str[0..$-1];
     return buffer;
   }
 }
--- a/trunk/src/dil/Parser.d	Tue Dec 18 15:14:41 2007 +0100
+++ b/trunk/src/dil/Parser.d	Tue Dec 18 21:23:52 2007 +0100
@@ -2749,7 +2749,7 @@
     switch (token.type)
     {
     case T.Int32, T.Int64, T.Uint32, T.Uint64:
-      e = new IntExpression(token.type, token.ulong_);
+      e = new IntExpression(token);
       nT();
       break;
     case T.Float32, T.Float64, T.Float80,
@@ -3302,7 +3302,7 @@
       e = new DollarExpression();
       break;
     case T.Int32, T.Int64, T.Uint32, T.Uint64:
-      e = new IntExpression(token.type, token.ulong_);
+      e = new IntExpression(token);
       nT();
       break;
     case T.Float32, T.Float64, T.Float80,