# HG changeset patch # User aziz # Date 1183310462 0 # Node ID f75e359f939fa9672f1c95fd160cabfcf7137ed2 # Parent b3777cca323c7119f80e7799473322ecd25e5341 - Added parseExpression() method. - Added while loop to parseAssignExpression(). - Implemented parseCondExpression(). diff -r b3777cca323c -r f75e359f939f trunk/src/Expressions.d --- a/trunk/src/Expressions.d Sun Jul 01 16:16:05 2007 +0000 +++ b/trunk/src/Expressions.d Sun Jul 01 17:21:02 2007 +0000 @@ -27,9 +27,20 @@ } } -class CondExpression : Expression +class CondExpression : BinaryExpression { + Expression condition; + this(Expression condition, Expression left, Expression right) + { + this.condition = condition; + super(left, right, TOK.Comma); + } +} +class CommaExpression : BinaryExpression +{ + this(Expression left, Expression right) + { super(left, right, TOK.Comma); } } class OrOrExpression : BinaryExpression diff -r b3777cca323c -r f75e359f939f trunk/src/Parser.d --- a/trunk/src/Parser.d Sun Jul 01 16:16:05 2007 +0000 +++ b/trunk/src/Parser.d Sun Jul 01 17:21:02 2007 +0000 @@ -39,57 +39,85 @@ nT = &lx.nextToken; } + Expression parseExpression() + { + auto e = parseAssignExpression(); + while (lx.token.type == TOK.Comma) + e = new CommaExpression(e, parseExpression()); + return e; + } + Expression parseAssignExpression() { auto e = parseCondExpression(); - switch (lx.token.type) + while (1) { - case T.Assign: - nT(); e = new AssignExpression(e, parseAssignExpression()); - break; - case T.LShiftAssign: - nT(); e = new LShiftAssignExpression(e, parseAssignExpression()); - break; - case T.RShiftAssign: - nT(); e = new RShiftAssignExpression(e, parseAssignExpression()); - break; - case T.URShiftAssign: - nT(); e = new URShiftAssignExpression(e, parseAssignExpression()); - break; - case T.OrAssign: - nT(); e = new OrAssignExpression(e, parseAssignExpression()); - break; - case T.AndAssign: - nT(); e = new AndAssignExpression(e, parseAssignExpression()); - break; - case T.PlusAssign: - nT(); e = new PlusAssignExpression(e, parseAssignExpression()); - break; - case T.MinusAssign: - nT(); e = new MinusAssignExpression(e, parseAssignExpression()); - break; - case T.DivAssign: - nT(); e = new DivAssignExpression(e, parseAssignExpression()); - break; - case T.MulAssign: - nT(); e = new MulAssignExpression(e, parseAssignExpression()); - break; - case T.ModAssign: - nT(); e = new ModAssignExpression(e, parseAssignExpression()); - break; - case T.XorAssign: - nT(); e = new XorAssignExpression(e, parseAssignExpression()); - break; - case T.CatAssign: - nT(); e = new CatAssignExpression(e, parseAssignExpression()); - break; - default: + switch (lx.token.type) + { + case T.Assign: + nT(); e = new AssignExpression(e, parseAssignExpression()); + break; + case T.LShiftAssign: + nT(); e = new LShiftAssignExpression(e, parseAssignExpression()); + break; + case T.RShiftAssign: + nT(); e = new RShiftAssignExpression(e, parseAssignExpression()); + break; + case T.URShiftAssign: + nT(); e = new URShiftAssignExpression(e, parseAssignExpression()); + break; + case T.OrAssign: + nT(); e = new OrAssignExpression(e, parseAssignExpression()); + break; + case T.AndAssign: + nT(); e = new AndAssignExpression(e, parseAssignExpression()); + break; + case T.PlusAssign: + nT(); e = new PlusAssignExpression(e, parseAssignExpression()); + break; + case T.MinusAssign: + nT(); e = new MinusAssignExpression(e, parseAssignExpression()); + break; + case T.DivAssign: + nT(); e = new DivAssignExpression(e, parseAssignExpression()); + break; + case T.MulAssign: + nT(); e = new MulAssignExpression(e, parseAssignExpression()); + break; + case T.ModAssign: + nT(); e = new ModAssignExpression(e, parseAssignExpression()); + break; + case T.XorAssign: + nT(); e = new XorAssignExpression(e, parseAssignExpression()); + break; + case T.CatAssign: + nT(); e = new CatAssignExpression(e, parseAssignExpression()); + break; + default: + break; + } break; } return e; } + Expression parseCondExpression() { + auto e = parseOrOrExpression(); + if (lx.token.type == TOK.Question) + { + nT(); + auto iftrue = parseExpression(); +// if (lx.toke.type != TOK.Colon) +// error(); + auto iffalse = parseCondExpression(); + e = new CondExpression(e, iftrue, iffalse); + } + return e; + } + + Expression parseOrOrExpression() + { return new Expression(); }