changeset 285:104343e0f097

- Started implementation of asm statements parser.
author aziz
date Tue, 07 Aug 2007 16:41:03 +0000
parents 00c887e6c0aa
children 0c1a2eba0c91
files trunk/src/Parser.d trunk/src/Statements.d trunk/src/SyntaxTree.d
diffstat 3 files changed, 113 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/trunk/src/Parser.d	Tue Aug 07 14:57:05 2007 +0000
+++ b/trunk/src/Parser.d	Tue Aug 07 16:41:03 2007 +0000
@@ -2437,10 +2437,96 @@
   Statement parseAsmStatement()
   {
     assert(token.type == T.Asm);
-    // TODO: implement asm statements parser.
+    nT(); // Skip asm keyword.
+    require(T.LBrace);
+    auto ss = new Statements;
+    while (token.type != T.RBrace && token.type != T.EOF)
+      ss ~= parseAsmInstruction();
+    require(T.RBrace);
+    return new AsmStatement(ss);
+  }
+
+  Statement parseAsmInstruction()
+  {
+    auto begin = token;
+    Statement s;
+    switch (token.type)
+    {
+    case T.Identifier:
+      auto ident = token;
+      auto next = peekNext();
+      if (next == T.Colon)
+      {
+        // Identifier : AsmInstruction
+        nT(); // Skip Identifier
+        nT(); // Skip :
+        s = new LabeledStatement(ident, parseAsmInstruction());
+        break;
+      }
+
+      // Opcode ;
+      // Opcode Operands ;
+      // Opcode
+      //     Identifier
+      Expression[] es;
+      if (next != T.Semicolon)
+      {
+        while (1)
+        {
+          es ~= parseAsmExpression();
+          if (token.type != T.Comma)
+            break;
+          nT();
+        }
+      }
+      require(T.Semicolon);
+      s = new AsmInstruction(ident, es);
+      break;
+    case T.Semicolon:
+      s = new EmptyStatement();
+      nT();
+      break;
+    default:
+      error(MID.ExpectedButFound, "AsmStatement", token.srcText);
+      s = new IllegalAsmInstruction(token);
+      nT();
+    }
+    set(s, begin);
+    return s;
+  }
+
+  Expression parseAsmExpression()
+  {
     return null;
   }
 
+  Expression parseAsmPrimaryExpression()
+  {
+    auto begin = token;
+    Expression e;
+    switch (token.type)
+    {
+    case T.Int32, T.Int64, T.Uint32, T.Uint64:
+      e = new IntNumberExpression(token.type, token.ulong_);
+      nT();
+      break;
+    case T.Float32, T.Float64, T.Float80,
+         T.Imaginary32, T.Imaginary64, T.Imaginary80:
+      e = new RealNumberExpression(token.type, token.real_);
+      nT();
+      break;
+    case T.Dollar:
+      e = new DollarExpression();
+      nT();
+      break;
+    default:
+      error(MID.ExpectedButFound, "Expression", token.srcText);
+      e = new EmptyExpression();
+    }
+    set(e, begin);
+    return e;
+  }
+
   /+++++++++++++++++++++++++++++
   + Expression parsing methods +
   +++++++++++++++++++++++++++++/
--- a/trunk/src/Statements.d	Tue Aug 07 14:57:05 2007 +0000
+++ b/trunk/src/Statements.d	Tue Aug 07 16:41:03 2007 +0000
@@ -369,9 +369,32 @@
 
 class AsmStatement : Statement
 {
-  this()
+  Statements statements;
+  this(Statements statements)
   {
     mixin(set_kind);
+    this.statements = statements;
+  }
+}
+
+class AsmInstruction : Statement
+{
+  Token* ident;
+  Expression[] operands;
+  this(Token* ident, Expression[] operands)
+  {
+    mixin(set_kind);
+    this.ident = ident;
+    this.operands = operands;
+  }
+}
+
+class IllegalAsmInstruction : IllegalStatement
+{
+  this(Token* token)
+  {
+    super(token);
+    mixin(set_kind);
   }
 }
 
--- a/trunk/src/SyntaxTree.d	Tue Aug 07 14:57:05 2007 +0000
+++ b/trunk/src/SyntaxTree.d	Tue Aug 07 16:41:03 2007 +0000
@@ -80,6 +80,8 @@
   ThrowStatement,
   VolatileStatement,
   AsmStatement,
+  AsmInstruction,
+  IllegalAsmInstruction,
   PragmaStatement,
   MixinStatement,
   StaticIfStatement,