Mercurial > projects > dang
annotate ast/Stmt.d @ 183:8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Fri, 25 Jul 2008 10:59:16 +0200 |
parents | ee202c72cd30 |
children |
rev | line source |
---|---|
1 | 1 module ast.Stmt; |
2 | |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
3 import Array = tango.core.Array, |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
4 Integer = tango.text.convert.Integer, |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
5 tango.io.Stdout; |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
6 |
1 | 7 import ast.Exp, |
8 ast.Decl; | |
9 | |
92
771ac63898e2
A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents:
88
diff
changeset
|
10 import sema.Scope, |
150 | 11 sema.VC, |
12 basic.Message, | |
114
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
13 basic.SourceLocation; |
1 | 14 |
15 enum StmtType | |
16 { | |
17 Stmt, | |
44
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
18 Compound, |
1 | 19 Decl, |
20 Exp, | |
21 Return, | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
22 If, |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
23 While, |
149
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
24 For, |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
25 Switch, |
1 | 26 } |
27 | |
150 | 28 abstract class Stmt |
1 | 29 { |
30 this(StmtType stmtType = StmtType.Stmt) | |
31 { | |
32 this.stmtType = stmtType; | |
33 } | |
34 | |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
35 void simplify() |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
36 { |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
37 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
38 |
150 | 39 void verify(VC vc) {} |
40 | |
41 /// The "main" location of the expression. | |
42 SourceLocation loc; | |
43 | |
44 /// Return the starting location of this statement | |
45 SourceLocation startLoc() { return loc; } | |
46 | |
47 /// Get the full extents of the expression | |
48 SourceRange sourceRange() { return SourceRange(loc, loc + 1); } | |
49 | |
1 | 50 StmtType stmtType; |
51 Scope env; | |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
52 int stmtIndex; |
1 | 53 } |
54 | |
44
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
55 class CompoundStatement : Stmt |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
56 { |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
57 this(Stmt[] stmts) |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
58 { |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
59 super(StmtType.Compound); |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
60 this.statements = stmts; |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
61 } |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
62 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
63 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
64 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
65 foreach (stmt; statements ) |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
66 stmt.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
67 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
68 |
44
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
69 Stmt[] statements; |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
70 } |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
71 |
1 | 72 class ReturnStmt : Stmt |
73 { | |
74 this() | |
75 { | |
76 super(StmtType.Return); | |
77 } | |
78 | |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
79 // Needed? |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
80 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
81 { |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
82 FuncDecl f = env.parentFunction; |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
83 if (exp) |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
84 exp = exp.simplify(); |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
85 if (f !is null && f.sret) |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
86 { |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
87 auto i = new Identifier("ret.val"); |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
88 i.env = f.env; |
126
c3b24e7e8cf8
Carius changes to the parser. Parsing attributes, lexing many keywords(not all yet).
Anders Johnsen <skabet@gmail.com>
parents:
114
diff
changeset
|
89 auto ass = new AssignExp(SLoc.Invalid, BinaryExp.Operator.Assign, i, exp); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
90 ass.env = f.env; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
91 auto assStmt = new ExpStmt(ass); |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
92 assStmt.env = f.env; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
93 |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
94 Stmt[] stmts; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
95 foreach(index, stmt ; f.statements) |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
96 { |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
97 if(stmtIndex == index) |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
98 stmts ~= assStmt; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
99 |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
100 stmts ~= stmt; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
101 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
102 f.statements = stmts; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
103 exp = null; |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
104 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
105 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
106 |
1 | 107 public Exp exp; |
108 } | |
109 | |
110 class DeclStmt : Stmt | |
111 { | |
112 this(Decl decl) | |
113 { | |
114 super(StmtType.Decl); | |
115 this.decl = decl; | |
116 } | |
117 | |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
118 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
119 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
120 decl.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
121 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
122 |
1 | 123 public Decl decl; |
124 } | |
125 | |
126 class ExpStmt : Stmt | |
127 { | |
128 this(Exp exp) | |
129 { | |
130 super(StmtType.Exp); | |
131 this.exp = exp; | |
132 } | |
133 | |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
134 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
135 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
136 exp = exp.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
137 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
138 |
1 | 139 public Exp exp; |
140 } | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
141 |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
142 class IfStmt : Stmt |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
143 { |
45 | 144 this(Exp cond, Stmt then, Stmt el = null) |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
145 { |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
146 super(StmtType.If); |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
147 this.cond = cond; |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
148 this.then_body = then; |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
149 this.else_body = el; |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
150 } |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
151 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
152 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
153 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
154 cond = cond.simplify(); |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
155 then_body.simplify(); |
59
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
57
diff
changeset
|
156 if (else_body) |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
157 else_body.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
158 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
159 |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
160 Exp cond; |
45 | 161 Stmt then_body; |
162 Stmt else_body; | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
163 } |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
164 |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
165 class WhileStmt : Stmt |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
166 { |
46 | 167 this(Exp cond, Stmt stmts) |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
168 { |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
169 super(StmtType.While); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
170 this.cond = cond; |
46 | 171 this.whileBody = stmts; |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
172 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
173 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
174 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
175 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
176 cond = cond.simplify(); |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
177 whileBody.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
178 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
179 |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
180 Exp cond; |
46 | 181 Stmt whileBody; |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
182 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
183 |
149
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
184 class ForStmt : Stmt |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
185 { |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
186 this(Stmt init, Exp cond, Exp incre, Stmt stmts) |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
187 { |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
188 super(StmtType.For); |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
189 this.init = init; |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
190 this.cond = cond; |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
191 this.incre = incre; |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
192 this.forBody = stmts; |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
193 } |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
194 |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
195 override void simplify() |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
196 { |
183
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
153
diff
changeset
|
197 if (cond) |
8ea749b7da91
Fixed a few errors so that two more tests passes. Also, now you only need a type in a function param.
Anders Johnsen <skabet@gmail.com>
parents:
153
diff
changeset
|
198 cond = cond.simplify(); |
149
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
199 forBody.simplify(); |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
200 } |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
201 |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
202 Exp cond, incre; |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
203 Stmt init, forBody; |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
204 } |
393a1f47a6d2
For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents:
143
diff
changeset
|
205 |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
206 class SwitchStmt : Stmt |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
207 { |
150 | 208 this(SourceLocation loc, Exp target) |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
209 { |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
210 super(StmtType.Switch); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
211 cond = target; |
150 | 212 this.loc = loc; |
213 } | |
214 | |
215 void addCase(SourceLocation _case, Exp[] values, Stmt[] stmts) | |
216 { | |
217 cases ~= Case(_case, values, stmts); | |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
218 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
219 |
150 | 220 void setDefault(SourceLocation _default, Stmt[] stmts) |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
221 { |
150 | 222 if (defaultBlock !is null) |
223 extraDefaultBlocks = true; | |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
224 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
225 defaultBlock = stmts; |
150 | 226 defaultLoc = _default; |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
227 if (cases.length > 0) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
228 cases[$ - 1].followedByDefault = true; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
229 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
230 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
231 override void simplify() |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
232 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
233 cond = cond.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
234 foreach ( stmt ; defaultBlock ) |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
235 stmt.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
236 foreach ( c ; cases ) |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
237 foreach ( stmt ; c.stmts ) |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
238 stmt.simplify(); |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
239 } |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
46
diff
changeset
|
240 |
150 | 241 override void verify(VC vc) |
242 { | |
243 if (extraDefaultBlocks) | |
244 vc.msg.report(MultipleDefaults, defaultLoc); | |
245 | |
246 if (cases.length == 0) | |
247 return; | |
248 | |
249 scope long[] all_values; | |
250 foreach (ref Case; cases) | |
251 { | |
252 long[] new_values; | |
253 foreach (exp; Case.values) | |
254 if (auto lit = cast(IntegerLit)exp) | |
255 new_values ~= Integer.parse(lit.get); | |
256 else | |
257 // We flag all non-literals and ignore them | |
258 vc.msg.report(InvalidCaseValue, exp.loc); | |
259 Case.values_converted = new_values; | |
260 all_values ~= new_values; | |
261 } | |
262 | |
263 Array.sort(all_values); | |
264 char[][] overlapping; | |
265 size_t i = 0; | |
266 while ((i = Array.findAdj(all_values)) < all_values.length | |
267 && all_values.length > 0) | |
268 { | |
269 overlapping ~= Integer.toString(all_values[i]); | |
270 auto similar = Array.count(all_values, all_values[i]); | |
271 all_values = all_values[i + similar .. $]; | |
272 } | |
273 if (overlapping.length > 0) | |
274 vc.msg.report(OverlappingCases, loc).arg(overlapping); | |
275 } | |
276 | |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
277 Exp cond; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
278 Case[] cases; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
279 Stmt[] defaultBlock; |
150 | 280 private bool extraDefaultBlocks = false; |
281 private SourceLocation defaultLoc; | |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
282 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
283 struct Case |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
284 { |
150 | 285 SourceLocation caseLoc; |
143
d76cc5cad4fc
Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents:
139
diff
changeset
|
286 Exp[] values; |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
287 Stmt[] stmts; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
288 long[] values_converted; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
289 bool followedByDefault = false; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
290 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
291 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
292 |