Mercurial > projects > dil
changeset 287:211bdd69397d
- Added classes AsmTypeExpression, AsmOffsetExpression, AsmSegExpression, AsmPostBracketExpression and AsmBracketExpression.
- Implemented method parseAsmExpression() and every sub-method connecting to parseAsmPrimaryExpression().
author | aziz |
---|---|
date | Tue, 07 Aug 2007 20:07:01 +0000 |
parents | 0c1a2eba0c91 |
children | 833b301497f4 |
files | trunk/src/Expressions.d trunk/src/Parser.d trunk/src/SyntaxTree.d |
diffstat | 3 files changed, 302 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/trunk/src/Expressions.d Tue Aug 07 17:02:01 2007 +0000 +++ b/trunk/src/Expressions.d Tue Aug 07 20:07:01 2007 +0000 @@ -833,3 +833,49 @@ this.values = values; } } + +class AsmTypeExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmOffsetExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmSegExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmPostBracketExpression : UnaryExpression +{ + this(Expression e) + { + super(e); + mixin(set_kind); + } +} + +class AsmBracketExpression : Expression +{ + Expression e; + this(Expression e) + { + mixin(set_kind); + this.e = e; + } +}
--- a/trunk/src/Parser.d Tue Aug 07 17:02:01 2007 +0000 +++ b/trunk/src/Parser.d Tue Aug 07 20:07:01 2007 +0000 @@ -2497,7 +2497,245 @@ Expression parseAsmExpression() { - return null; + auto begin = token; + auto e = parseOrOrExpression(); + if (token.type == T.Question) + { + nT(); + auto iftrue = parseAsmExpression(); + require(T.Colon); + auto iffalse = parseAsmExpression(); + e = new CondExpression(e, iftrue, iffalse); + set(e, begin); + } + return e; + } + + Expression parseAsmOrOrExpression() + { + auto begin = token; + alias parseAsmAndAndExpression parseNext; + auto e = parseNext(); + while (token.type == T.OrLogical) + { + auto tok = token; + nT(); + e = new OrOrExpression(e, parseNext(), tok); + set(e, begin); + } + return e; + } + + Expression parseAsmAndAndExpression() + { + auto begin = token; + alias parseAsmOrExpression parseNext; + auto e = parseNext(); + while (token.type == T.AndLogical) + { + auto tok = token; + nT(); + e = new AndAndExpression(e, parseNext(), tok); + set(e, begin); + } + return e; + } + + Expression parseAsmOrExpression() + { + auto begin = token; + alias parseAsmXorExpression parseNext; + auto e = parseNext(); + while (token.type == T.OrBinary) + { + auto tok = token; + nT(); + e = new OrExpression(e, parseNext(), tok); + set(e, begin); + } + return e; + } + + Expression parseAsmXorExpression() + { + alias parseAsmAndExpression parseNext; + auto begin = token; + auto e = parseNext(); + while (token.type == T.Xor) + { + auto tok = token; + nT(); + e = new XorExpression(e, parseNext(), tok); + set(e, begin); + } + return e; + } + + Expression parseAsmAndExpression() + { + alias parseAsmCmpExpression parseNext; + auto begin = token; + auto e = parseNext(); + while (token.type == T.AndBinary) + { + auto tok = token; + nT(); + e = new AndExpression(e, parseNext(), tok); + set(e, begin); + } + return e; + } + + Expression parseAsmCmpExpression() + { + alias parseAsmShiftExpression parseNext; + auto begin = token; + auto e = parseNext(); + + auto operator = token; + switch (operator.type) + { + case T.Equal, T.NotEqual: + nT(); + e = new EqualExpression(e, parseNext(), operator); + break; + case T.LessEqual, T.Less, T.GreaterEqual, T.Greater: + nT(); + e = new RelExpression(e, parseNext(), operator); + break; + default: + return e; + } + set(e, begin); + return e; + } + + Expression parseAsmShiftExpression() + { + alias parseAsmAddExpression parseNext; + auto begin = token; + auto e = parseNext(); + while (1) + { + auto operator = token; + switch (operator.type) + { + case T.LShift: nT(); e = new LShiftExpression(e, parseNext(), operator); break; + case T.RShift: nT(); e = new RShiftExpression(e, parseNext(), operator); break; + case T.URShift: nT(); e = new URShiftExpression(e, parseNext(), operator); break; + default: + return e; + } + set(e, begin); + } + assert(0); + } + + Expression parseAsmAddExpression() + { + alias parseAsmMulExpression parseNext; + auto begin = token; + auto e = parseNext(); + while (1) + { + auto operator = token; + switch (operator.type) + { + case T.Plus: nT(); e = new PlusExpression(e, parseNext(), operator); break; + case T.Minus: nT(); e = new MinusExpression(e, parseNext(), operator); break; + // Not allowed in asm + //case T.Tilde: nT(); e = new CatExpression(e, parseNext(), operator); break; + default: + return e; + } + set(e, begin); + } + assert(0); + } + + Expression parseAsmMulExpression() + { + alias parseAsmPostExpression parseNext; + auto begin = token; + auto e = parseNext(); + while (1) + { + auto operator = token; + switch (operator.type) + { + case T.Mul: nT(); e = new MulExpression(e, parseNext(), operator); break; + case T.Div: nT(); e = new DivExpression(e, parseNext(), operator); break; + case T.Mod: nT(); e = new ModExpression(e, parseNext(), operator); break; + default: + return e; + } + set(e, begin); + } + assert(0); + } + + Expression parseAsmPostExpression() + { + auto begin = token; + auto e = parseAsmUnaryExpression(); + while (token.type == T.RBracket) + { + nT(); + e = parseAsmExpression(); + e = new AsmPostBracketExpression(e); + require(T.RBracket); + set(e, begin); + } + return e; + } + + Expression parseAsmUnaryExpression() + { + auto begin = token; + Expression e; + switch (token.type) + { + case T.Identifier: + switch (token.identifier) + { + case "near", "far", "byte", "short", "int", + "word", "dword", "float", "double", "real": + nT(); + if (token.type == T.Identifier && token.identifier == "ptr") + nT(); + else + error(MID.ExpectedButFound, "ptr", token.srcText); + e = new AsmTypeExpression(parseAsmUnaryExpression()); + break; + case "offset": + nT(); + e = new AsmOffsetExpression(parseAsmUnaryExpression()); + break; + case "seg": + nT(); + e = new AsmSegExpression(parseAsmUnaryExpression()); + break; + default: + } + goto default; + case T.Minus: + case T.Plus: + nT(); + e = new SignExpression(parseAsmUnaryExpression()); + break; + case T.Not: + nT(); + e = new NotExpression(parseAsmUnaryExpression()); + break; + case T.Tilde: + nT(); + e = new CompExpression(parseAsmUnaryExpression()); + default: + e = parseAsmPrimaryExpression(); + return e; + } + set(e, begin); + return e; } Expression parseAsmPrimaryExpression() @@ -2519,9 +2757,21 @@ e = new DollarExpression(); nT(); break; + case T.LBracket: + // [ AsmExpression ] + nT(); + e = parseAsmExpression(); + require(T.RBracket); + e = new AsmBracketExpression(e); + break; +// __LOCAL_SIZE +// $ +// Register +// DotIdentifier default: error(MID.ExpectedButFound, "Expression", token.srcText); e = new EmptyExpression(); + break; } set(e, begin); return e;
--- a/trunk/src/SyntaxTree.d Tue Aug 07 17:02:01 2007 +0000 +++ b/trunk/src/SyntaxTree.d Tue Aug 07 20:07:01 2007 +0000 @@ -173,6 +173,11 @@ VoidInitializer, ArrayInitializer, StructInitializer, + AsmTypeExpression, + AsmOffsetExpression, + AsmSegExpression, + AsmPostBracketExpression, + AsmBracketExpression, // Types: IntegralType,