# HG changeset patch # User aziz # Date 1186504863 0 # Node ID 104343e0f0973533505b198b3f016a4af0bf9cf8 # Parent 00c887e6c0aaf04b9d8388bd23a847b2e053fe39 - Started implementation of asm statements parser. diff -r 00c887e6c0aa -r 104343e0f097 trunk/src/Parser.d --- 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 + +++++++++++++++++++++++++++++/ diff -r 00c887e6c0aa -r 104343e0f097 trunk/src/Statements.d --- 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); } } diff -r 00c887e6c0aa -r 104343e0f097 trunk/src/SyntaxTree.d --- 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,