changeset 374:6d22f0b6a674

- Added class AsmAlignStatement. - Added code and made several fixes to asm statements parsing methods.
author aziz
date Fri, 07 Sep 2007 11:36:01 +0000
parents 3df70e5e87f3
children 0bd21b746a04
files trunk/src/dil/Parser.d trunk/src/dil/Statements.d trunk/src/dil/SyntaxTree.d
diffstat 3 files changed, 56 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/dil/Parser.d	Thu Sep 06 14:56:02 2007 +0000
+++ b/trunk/src/dil/Parser.d	Fri Sep 07 11:36:01 2007 +0000
@@ -2505,26 +2505,32 @@
   {
     auto begin = token;
     Statement s;
+    typeof(token) ident;
     switch (token.type)
     {
+    // Keywords that are valid opcodes.
+    case T.In, T.Int, T.Out:
+      ident = token;
+      nT();
+      goto LOpcode;
     case T.Identifier:
-      auto ident = token;
-      auto next = peekNext();
-      if (next == T.Colon)
+      ident = token;
+      nT(); // Skip Identifier
+      if (token.type == T.Colon)
       {
         // Identifier : AsmInstruction
-        nT(); // Skip Identifier
         nT(); // Skip :
         s = new LabeledStatement(ident, parseAsmInstruction());
         break;
       }
 
+    LOpcode:
       // Opcode ;
       // Opcode Operands ;
       // Opcode
       //     Identifier
       Expression[] es;
-      if (next != T.Semicolon)
+      if (token.type != T.Semicolon)
       {
         while (1)
         {
@@ -2537,12 +2543,29 @@
       require(T.Semicolon);
       s = new AsmInstruction(ident, es);
       break;
+    case T.Align:
+      nT();
+      auto number = token;
+      switch (token.type)
+      {
+      case T.Int32, T.Int64, T.Uint32, T.Uint64:
+        number = token; nT(); break;
+      default:
+        if (token.type != T.Semicolon)
+          nT();
+        number = null;
+        // TODO: report error: number expected after asm align statement.
+        error(MID.ExpectedButFound, "integer", token.srcText);
+      }
+      require(T.Semicolon);
+      s = new AsmAlignStatement(number);
+      break;
     case T.Semicolon:
       s = new EmptyStatement();
       nT();
       break;
     default:
-      error(MID.ExpectedButFound, "AsmStatement", token.srcText);
+      error(MID.ExpectedButFound, "AsmInstruction", token.srcText);
       s = new IllegalAsmInstruction(token);
       nT();
     }
@@ -2553,7 +2576,7 @@
   Expression parseAsmExpression()
   {
     auto begin = token;
-    auto e = parseOrOrExpression();
+    auto e = parseAsmOrOrExpression();
     if (token.type == T.Question)
     {
       auto tok = token;
@@ -2735,7 +2758,7 @@
   {
     auto begin = token;
     auto e = parseAsmUnaryExpression();
-    while (token.type == T.RBracket)
+    while (token.type == T.LBracket)
     {
       nT();
       e = parseAsmExpression();
@@ -2752,29 +2775,34 @@
     Expression e;
     switch (token.type)
     {
+    case T.Byte,  T.Short,  T.Int,
+         T.Float, T.Double, T.Real:
+      goto LAsmTypePrefix;
     case T.Identifier:
       switch (token.identifier)
       {
-      case "near", "far",   "byte",  "short",  "int",
-           "word", "dword", "float", "double", "real":
+      case "near", "far",   /*"byte",  "short",  "int",*/
+           "word", "dword"/*, "float", "double", "real"*/:
+      LAsmTypePrefix:
         nT();
         if (token.type == T.Identifier && token.identifier == "ptr")
           nT();
         else
           error(MID.ExpectedButFound, "ptr", token.srcText);
-        e = new AsmTypeExpression(parseAsmUnaryExpression());
+        e = new AsmTypeExpression(parseAsmExpression());
         break;
       case "offset":
         nT();
-        e = new AsmOffsetExpression(parseAsmUnaryExpression());
+        e = new AsmOffsetExpression(parseAsmExpression());
         break;
       case "seg":
         nT();
-        e = new AsmSegExpression(parseAsmUnaryExpression());
+        e = new AsmSegExpression(parseAsmExpression());
         break;
       default:
+        goto LparseAsmPrimaryExpression;
       }
-      goto default;
+      break;
     case T.Minus:
     case T.Plus:
       nT();
@@ -2788,6 +2816,7 @@
       nT();
       e = new CompExpression(parseAsmUnaryExpression());
     default:
+    LparseAsmPrimaryExpression:
       e = parseAsmPrimaryExpression();
       return e;
     }
--- a/trunk/src/dil/Statements.d	Thu Sep 06 14:56:02 2007 +0000
+++ b/trunk/src/dil/Statements.d	Fri Sep 07 11:36:01 2007 +0000
@@ -435,12 +435,23 @@
   this(Token* ident, Expression[] operands)
   {
     mixin(set_kind);
-    this.children = operands;
+    if (operands.length)
+      this.children = operands;
     this.ident = ident;
     this.operands = operands;
   }
 }
 
+class AsmAlignStatement : Statement
+{
+  Token* number;
+  this(Token* number)
+  {
+    mixin(set_kind);
+    this.number = number;
+  }
+}
+
 class IllegalAsmInstruction : IllegalStatement
 {
   this(Token* token)
--- a/trunk/src/dil/SyntaxTree.d	Thu Sep 06 14:56:02 2007 +0000
+++ b/trunk/src/dil/SyntaxTree.d	Fri Sep 07 11:36:01 2007 +0000
@@ -82,6 +82,7 @@
   VolatileStatement,
   AsmStatement,
   AsmInstruction,
+  AsmAlignStatement,
   IllegalAsmInstruction,
   PragmaStatement,
   MixinStatement,