Mercurial > projects > dil
annotate 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 |
rev | line source |
---|---|
0 | 1 /++ |
2 Author: Aziz Köksal | |
3 License: GPL2 | |
4 +/ | |
65 | 5 module Parser; |
69
24db7c5522d5
- Added module Information for compiler messages like warnings, info and errors to the user.
aziz
parents:
68
diff
changeset
|
6 import Lexer; |
71 | 7 import Token; |
8 import Messages; | |
9 import Information; | |
70 | 10 import Expressions; |
65 | 11 |
68
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
12 enum STC |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
13 { |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
14 Abstract, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
15 Auto, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
16 Const, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
17 Deprecated, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
18 Extern, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
19 Final, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
20 Invariant, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
21 Override, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
22 Scope, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
23 Static, |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
24 Synchronized |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
25 } |
7eb83dd38901
- Simplified suffix rule and added a few more numbers to unittest.
aziz
parents:
65
diff
changeset
|
26 |
71 | 27 private alias TOK T; |
28 | |
65 | 29 class Parser |
30 { | |
71 | 31 Lexer lx; |
32 TOK delegate() nT; | |
33 | |
34 Information[] errors; | |
35 | |
36 this(char[] srcText, string fileName) | |
37 { | |
38 lx = new Lexer(srcText, fileName); | |
39 nT = &lx.nextToken; | |
40 } | |
70 | 41 |
72 | 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 | |
71 | 50 Expression parseAssignExpression() |
51 { | |
52 auto e = parseCondExpression(); | |
72 | 53 while (1) |
71 | 54 { |
72 | 55 switch (lx.token.type) |
56 { | |
57 case T.Assign: | |
58 nT(); e = new AssignExpression(e, parseAssignExpression()); | |
59 break; | |
60 case T.LShiftAssign: | |
61 nT(); e = new LShiftAssignExpression(e, parseAssignExpression()); | |
62 break; | |
63 case T.RShiftAssign: | |
64 nT(); e = new RShiftAssignExpression(e, parseAssignExpression()); | |
65 break; | |
66 case T.URShiftAssign: | |
67 nT(); e = new URShiftAssignExpression(e, parseAssignExpression()); | |
68 break; | |
69 case T.OrAssign: | |
70 nT(); e = new OrAssignExpression(e, parseAssignExpression()); | |
71 break; | |
72 case T.AndAssign: | |
73 nT(); e = new AndAssignExpression(e, parseAssignExpression()); | |
74 break; | |
75 case T.PlusAssign: | |
76 nT(); e = new PlusAssignExpression(e, parseAssignExpression()); | |
77 break; | |
78 case T.MinusAssign: | |
79 nT(); e = new MinusAssignExpression(e, parseAssignExpression()); | |
80 break; | |
81 case T.DivAssign: | |
82 nT(); e = new DivAssignExpression(e, parseAssignExpression()); | |
83 break; | |
84 case T.MulAssign: | |
85 nT(); e = new MulAssignExpression(e, parseAssignExpression()); | |
86 break; | |
87 case T.ModAssign: | |
88 nT(); e = new ModAssignExpression(e, parseAssignExpression()); | |
89 break; | |
90 case T.XorAssign: | |
91 nT(); e = new XorAssignExpression(e, parseAssignExpression()); | |
92 break; | |
93 case T.CatAssign: | |
94 nT(); e = new CatAssignExpression(e, parseAssignExpression()); | |
95 break; | |
96 default: | |
97 break; | |
98 } | |
71 | 99 break; |
100 } | |
101 return e; | |
102 } | |
72 | 103 |
71 | 104 Expression parseCondExpression() |
105 { | |
72 | 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() | |
120 { | |
71 | 121 return new Expression(); |
122 } | |
123 | |
124 void error(MID id, ...) | |
125 { | |
126 errors ~= new Information(Information.Type.Parser, id, lx.loc, arguments(_arguments, _argptr)); | |
127 } | |
65 | 128 } |