Mercurial > projects > dil
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)