Mercurial > projects > dil
comparison trunk/src/Parser.d @ 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 |
comparison
equal
deleted
inserted
replaced
71:b3777cca323c | 72:f75e359f939f |
---|---|
37 { | 37 { |
38 lx = new Lexer(srcText, fileName); | 38 lx = new Lexer(srcText, fileName); |
39 nT = &lx.nextToken; | 39 nT = &lx.nextToken; |
40 } | 40 } |
41 | 41 |
42 Expression parseExpression() | |
43 { | |
44 auto e = parseAssignExpression(); | |
45 while (lx.token.type == TOK.Comma) | |
46 e = new CommaExpression(e, parseExpression()); | |
47 return e; | |
48 } | |
49 | |
42 Expression parseAssignExpression() | 50 Expression parseAssignExpression() |
43 { | 51 { |
44 auto e = parseCondExpression(); | 52 auto e = parseCondExpression(); |
45 switch (lx.token.type) | 53 while (1) |
46 { | 54 { |
47 case T.Assign: | 55 switch (lx.token.type) |
48 nT(); e = new AssignExpression(e, parseAssignExpression()); | 56 { |
49 break; | 57 case T.Assign: |
50 case T.LShiftAssign: | 58 nT(); e = new AssignExpression(e, parseAssignExpression()); |
51 nT(); e = new LShiftAssignExpression(e, parseAssignExpression()); | 59 break; |
52 break; | 60 case T.LShiftAssign: |
53 case T.RShiftAssign: | 61 nT(); e = new LShiftAssignExpression(e, parseAssignExpression()); |
54 nT(); e = new RShiftAssignExpression(e, parseAssignExpression()); | 62 break; |
55 break; | 63 case T.RShiftAssign: |
56 case T.URShiftAssign: | 64 nT(); e = new RShiftAssignExpression(e, parseAssignExpression()); |
57 nT(); e = new URShiftAssignExpression(e, parseAssignExpression()); | 65 break; |
58 break; | 66 case T.URShiftAssign: |
59 case T.OrAssign: | 67 nT(); e = new URShiftAssignExpression(e, parseAssignExpression()); |
60 nT(); e = new OrAssignExpression(e, parseAssignExpression()); | 68 break; |
61 break; | 69 case T.OrAssign: |
62 case T.AndAssign: | 70 nT(); e = new OrAssignExpression(e, parseAssignExpression()); |
63 nT(); e = new AndAssignExpression(e, parseAssignExpression()); | 71 break; |
64 break; | 72 case T.AndAssign: |
65 case T.PlusAssign: | 73 nT(); e = new AndAssignExpression(e, parseAssignExpression()); |
66 nT(); e = new PlusAssignExpression(e, parseAssignExpression()); | 74 break; |
67 break; | 75 case T.PlusAssign: |
68 case T.MinusAssign: | 76 nT(); e = new PlusAssignExpression(e, parseAssignExpression()); |
69 nT(); e = new MinusAssignExpression(e, parseAssignExpression()); | 77 break; |
70 break; | 78 case T.MinusAssign: |
71 case T.DivAssign: | 79 nT(); e = new MinusAssignExpression(e, parseAssignExpression()); |
72 nT(); e = new DivAssignExpression(e, parseAssignExpression()); | 80 break; |
73 break; | 81 case T.DivAssign: |
74 case T.MulAssign: | 82 nT(); e = new DivAssignExpression(e, parseAssignExpression()); |
75 nT(); e = new MulAssignExpression(e, parseAssignExpression()); | 83 break; |
76 break; | 84 case T.MulAssign: |
77 case T.ModAssign: | 85 nT(); e = new MulAssignExpression(e, parseAssignExpression()); |
78 nT(); e = new ModAssignExpression(e, parseAssignExpression()); | 86 break; |
79 break; | 87 case T.ModAssign: |
80 case T.XorAssign: | 88 nT(); e = new ModAssignExpression(e, parseAssignExpression()); |
81 nT(); e = new XorAssignExpression(e, parseAssignExpression()); | 89 break; |
82 break; | 90 case T.XorAssign: |
83 case T.CatAssign: | 91 nT(); e = new XorAssignExpression(e, parseAssignExpression()); |
84 nT(); e = new CatAssignExpression(e, parseAssignExpression()); | 92 break; |
85 break; | 93 case T.CatAssign: |
86 default: | 94 nT(); e = new CatAssignExpression(e, parseAssignExpression()); |
95 break; | |
96 default: | |
97 break; | |
98 } | |
87 break; | 99 break; |
88 } | 100 } |
89 return e; | 101 return e; |
90 } | 102 } |
103 | |
91 Expression parseCondExpression() | 104 Expression parseCondExpression() |
105 { | |
106 auto e = parseOrOrExpression(); | |
107 if (lx.token.type == TOK.Question) | |
108 { | |
109 nT(); | |
110 auto iftrue = parseExpression(); | |
111 // if (lx.toke.type != TOK.Colon) | |
112 // error(); | |
113 auto iffalse = parseCondExpression(); | |
114 e = new CondExpression(e, iftrue, iffalse); | |
115 } | |
116 return e; | |
117 } | |
118 | |
119 Expression parseOrOrExpression() | |
92 { | 120 { |
93 return new Expression(); | 121 return new Expression(); |
94 } | 122 } |
95 | 123 |
96 void error(MID id, ...) | 124 void error(MID id, ...) |