Mercurial > projects > dang
changeset 78:ad956143dcdc new_gen
Parse and gen for dereferences
author | Anders Halager <halager@gmail.com> |
---|---|
date | Fri, 02 May 2008 16:38:31 +0200 |
parents | 9171f04dd9ee |
children | 81813366ef92 |
files | ast/Exp.d gen/CodeGen.d parser/Parser.d sema/AstAction.d sema/Visitor.d tools/AstPrinter.d |
diffstat | 6 files changed, 51 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/ast/Exp.d Fri May 02 15:48:57 2008 +0200 +++ b/ast/Exp.d Fri May 02 16:38:31 2008 +0200 @@ -15,6 +15,7 @@ { Binary, Negate, + Deref, IntegerLit, MemberReference, ArrayReference, @@ -210,6 +211,26 @@ super(ExpType.Negate); this.exp = exp; } + + Exp simplify() + { + exp = exp.simplify; + return this; + } + + override DType type() { return exp.type(); } + + public Exp exp; +} + +class DerefExp : Exp +{ + this(Exp exp) + { + super(ExpType.Deref); + this.exp = exp; + } + Exp simplify() { exp = exp.simplify;
--- a/gen/CodeGen.d Fri May 02 15:48:57 2008 +0200 +++ b/gen/CodeGen.d Fri May 02 16:38:31 2008 +0200 @@ -270,6 +270,10 @@ auto negateExp = cast(NegateExp)exp; auto target = genExpression(negateExp.exp); return b.buildNeg(target, "neg"); + case ExpType.Deref: + auto derefExp = cast(DerefExp)exp; + auto target = genExpression(derefExp.exp); + return b.buildLoad(target, "deref"); case ExpType.AssignExp: auto assignExp = cast(AssignExp)exp; return buildAssign(assignExp.identifier, assignExp.exp);
--- a/parser/Parser.d Fri May 02 15:48:57 2008 +0200 +++ b/parser/Parser.d Fri May 02 16:38:31 2008 +0200 @@ -423,7 +423,11 @@ int prec; } - static const UnOp[] _unary = [{Tok.Minus, 4}]; + static const UnOp[] _unary = + [ + {Tok.Minus, 4}, + {Tok.Star, 4} + ]; UnOp* unary(Tok t) { foreach (ref op; _unary)
--- a/sema/AstAction.d Fri May 02 15:48:57 2008 +0200 +++ b/sema/AstAction.d Fri May 02 16:38:31 2008 +0200 @@ -128,8 +128,11 @@ override ExprT actOnUnaryOp(Token op, ExprT operand) { Exp target = cast(Exp)operand; - // can only be -x for now - return new NegateExp(target); + if (op.type == Tok.Minus) + return new NegateExp(target); + if (op.type == Tok.Star) + return new DerefExp(target); + assert(0, "Only valid unary expressions are -x and *x"); } override ExprT actOnCallExpr(ExprT fn, ref Token, ExprT[] args, ref Token)
--- a/sema/Visitor.d Fri May 02 15:48:57 2008 +0200 +++ b/sema/Visitor.d Fri May 02 16:38:31 2008 +0200 @@ -70,6 +70,8 @@ return visitIntegerLit(cast(IntegerLit)exp); case ExpType.Negate: return visitNegateExp(cast(NegateExp)exp); + case ExpType.Deref: + return visitDerefExp(cast(DerefExp)exp); case ExpType.AssignExp: return visitAssignExp(cast(AssignExp)exp); case ExpType.CallExp: @@ -257,6 +259,15 @@ return ExpT.init; } + ExpT visitDerefExp(DerefExp exp) + { + visitExp(exp.exp); + static if (is(ExpT == void)) + return; + else + return ExpT.init; + } + ExpT visitIntegerLit(IntegerLit exp) { static if (is(ExpT == void))
--- a/tools/AstPrinter.d Fri May 02 15:48:57 2008 +0200 +++ b/tools/AstPrinter.d Fri May 02 16:38:31 2008 +0200 @@ -120,6 +120,11 @@ print("-"); printExp(negateExp.exp); break; + case ExpType.Deref: + auto derefExp = cast(DerefExp)exp; + print("*"); + printExp(derefExp.exp); + break; case ExpType.AssignExp: auto assignExp = cast(AssignExp)exp; printExp(assignExp.identifier);