# HG changeset patch # User aziz # Date 1186569962 0 # Node ID 833b301497f4a69ec090371f18cc10897e37b63d # Parent 211bdd69397d389b017d3362baa7826c579d508c - Added classes AsmLocalSizeExpression and AsmRegisterExpression. - Added code to parseAsmPrimaryExpression() for parsing registers and identifier expressions. diff -r 211bdd69397d -r 833b301497f4 trunk/src/Expressions.d --- 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; + } +} diff -r 211bdd69397d -r 833b301497f4 trunk/src/Parser.d --- 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(); diff -r 211bdd69397d -r 833b301497f4 trunk/src/SyntaxTree.d --- 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,