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, ...)