Mercurial > projects > dil
changeset 72:f75e359f939f
- Added parseExpression() method.
- Added while loop to parseAssignExpression().
- Implemented parseCondExpression().
author | aziz |
---|---|
date | Sun, 01 Jul 2007 17:21:02 +0000 |
parents | b3777cca323c |
children | 11572f4a138c |
files | trunk/src/Expressions.d trunk/src/Parser.d |
diffstat | 2 files changed, 81 insertions(+), 42 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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(); }