changeset 288:833b301497f4

- Added classes AsmLocalSizeExpression and AsmRegisterExpression. - Added code to parseAsmPrimaryExpression() for parsing registers and identifier expressions.
author aziz
date Wed, 08 Aug 2007 10:46:02 +0000
parents 211bdd69397d
children a99357783c6f
files trunk/src/Expressions.d trunk/src/Parser.d trunk/src/SyntaxTree.d
diffstat 3 files changed, 87 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Expressions.d	Tue Aug 07 20:07:01 2007 +0000
+++ b/trunk/src/Expressions.d	Wed Aug 08 10:46:02 2007 +0000
@@ -879,3 +879,23 @@
     this.e = e;
   }
 }
+
+class AsmLocalSizeExpression : Expression
+{
+  this()
+  {
+    mixin(set_kind);
+  }
+}
+
+class AsmRegisterExpression : Expression
+{
+  Token* register;
+  Token* number; // ST(0) - ST(7)
+  this(Token* register, Token* number = null)
+  {
+    mixin(set_kind);
+    this.register = register;
+    this.number = number;
+  }
+}
--- a/trunk/src/Parser.d	Tue Aug 07 20:07:01 2007 +0000
+++ b/trunk/src/Parser.d	Wed Aug 08 10:46:02 2007 +0000
@@ -2508,6 +2508,7 @@
       e = new CondExpression(e, iftrue, iffalse);
       set(e, begin);
     }
+    // TODO: create AsmExpression that contains e?
     return e;
   }
 
@@ -2764,10 +2765,70 @@
       require(T.RBracket);
       e = new AsmBracketExpression(e);
       break;
-//     __LOCAL_SIZE
-//     $
-//     Register
-//     DotIdentifier
+    case T.Identifier:
+      switch (token.identifier)
+      {
+      // __LOCAL_SIZE
+      case "__LOCAL_SIZE":
+        e = new AsmLocalSizeExpression();
+        nT();
+        break;
+      // Register
+      case "ST":
+        auto register = token;
+        nT();
+        // (1) - (7)
+        Token* number;
+        if (token.type == T.LParen)
+        {
+          nT();
+          if (token.type == T.Int32)
+          {
+            number = token;
+            nT();
+          }
+          else
+            expected(T.Int32);
+          require(T.RParen);
+        }
+        e = new AsmRegisterExpression(register, number);
+        break;
+      case "AL", "AH", "AX", "EAX",
+           "BL", "BH", "BX", "EBX",
+           "CL", "CH", "CX", "ECX",
+           "DL", "DH", "DX", "EDX",
+           "BP", "EBP",
+           "SP", "ESP",
+           "DI", "EDI",
+           "SI", "ESI",
+           "ES", "CS", "SS", "DS", "GS", "FS",
+           "CR0", "CR2", "CR3", "CR4",
+           "DR0", "DR1", "DR2", "DR3", "DR6", "DR7",
+           "TR3", "TR4", "TR5", "TR6", "TR7",
+           "MM0", "MM1", "MM2", "MM3", "MM4", "MM5", "MM6", "MM7",
+           "XMM0", "XMM1", "XMM2", "XMM3", "XMM4", "XMM5", "XMM6", "XMM7":
+          e = new AsmRegisterExpression(token);
+          nT();
+        break;
+      default:
+        // DotIdentifier
+        auto begin2 = token;
+        Expression[] identList;
+        goto LenterLoop;
+        while (token.type == T.Dot)
+        {
+          nT();
+          begin2 = token;
+          auto ident = requireId();
+        LenterLoop:
+          e = new IdentifierExpression(token);
+          nT();
+          set(e, begin2);
+          identList ~= e;
+        }
+        e = new DotListExpression(identList);
+      }
+      break;
     default:
       error(MID.ExpectedButFound, "Expression", token.srcText);
       e = new EmptyExpression();
--- a/trunk/src/SyntaxTree.d	Tue Aug 07 20:07:01 2007 +0000
+++ b/trunk/src/SyntaxTree.d	Wed Aug 08 10:46:02 2007 +0000
@@ -178,6 +178,8 @@
   AsmSegExpression,
   AsmPostBracketExpression,
   AsmBracketExpression,
+  AsmLocalSizeExpression,
+  AsmRegisterExpression,
 
   // Types:
   IntegralType,