Mercurial > projects > dang
annotate ast/Stmt.d @ 139:a22e3663de89
Fixed up our simplify functions
Removed some unused stuff and changed all function calls to have () attached.
We should only omit parens when calling something that is supposed to be a
property - not a function like simplify
author | Anders Halager <halager@gmail.com> |
---|---|
date | Fri, 18 Jul 2008 13:32:34 +0200 |
parents | c3b24e7e8cf8 |
children | d76cc5cad4fc |
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, |
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
|
11 basic.SourceLocation; |
1 | 12 |
13 enum StmtType | |
14 { | |
15 Stmt, | |
44
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
16 Compound, |
1 | 17 Decl, |
18 Exp, | |
19 Return, | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
20 If, |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
21 While, |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
22 Switch, |
1 | 23 } |
24 | |
25 class Stmt | |
26 { | |
27 this(StmtType stmtType = StmtType.Stmt) | |
28 { | |
29 this.stmtType = stmtType; | |
30 } | |
31 | |
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
|
32 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
|
33 { |
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
|
34 } |
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 |
1 | 36 StmtType stmtType; |
37 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
|
38 int stmtIndex; |
1 | 39 } |
40 | |
44
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
41 class CompoundStatement : Stmt |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
42 { |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
43 this(Stmt[] stmts) |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
44 { |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
45 super(StmtType.Compound); |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
46 this.statements = stmts; |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
47 } |
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
48 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
49 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
|
50 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
51 foreach (stmt; statements ) |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
52 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
|
53 } |
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
|
54 |
44
495188f9078e
Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents:
36
diff
changeset
|
55 Stmt[] statements; |
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 |
1 | 58 class ReturnStmt : Stmt |
59 { | |
60 this() | |
61 { | |
62 super(StmtType.Return); | |
63 } | |
64 | |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
65 // Needed? |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
66 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
|
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 FuncDecl f = env.parentFunction; |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
69 if (exp) |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
70 exp = exp.simplify(); |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
71 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
|
72 { |
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
|
73 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 |
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
|
80 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
|
81 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
|
82 { |
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
|
83 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
|
84 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
|
85 |
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 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
|
87 } |
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 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
|
89 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
|
90 } |
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 } |
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 |
1 | 93 public Exp exp; |
94 } | |
95 | |
96 class DeclStmt : Stmt | |
97 { | |
98 this(Decl decl) | |
99 { | |
100 super(StmtType.Decl); | |
101 this.decl = decl; | |
102 } | |
103 | |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
104 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
|
105 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
106 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
|
107 } |
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
|
108 |
1 | 109 public Decl decl; |
110 } | |
111 | |
112 class ExpStmt : Stmt | |
113 { | |
114 this(Exp exp) | |
115 { | |
116 super(StmtType.Exp); | |
117 this.exp = exp; | |
118 } | |
119 | |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
120 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
|
121 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
122 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
|
123 } |
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
|
124 |
1 | 125 public Exp exp; |
126 } | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
127 |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
128 class IfStmt : Stmt |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
129 { |
45 | 130 this(Exp cond, Stmt then, Stmt el = null) |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
131 { |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
132 super(StmtType.If); |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
133 this.cond = cond; |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
134 this.then_body = then; |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
135 this.else_body = el; |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
136 } |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
137 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
138 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
|
139 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
140 cond = cond.simplify(); |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
141 then_body.simplify(); |
59
1d6f4ad38a91
Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents:
57
diff
changeset
|
142 if (else_body) |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
143 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
|
144 } |
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
|
145 |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
146 Exp cond; |
45 | 147 Stmt then_body; |
148 Stmt else_body; | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
149 } |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
150 |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
151 class WhileStmt : Stmt |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
152 { |
46 | 153 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
|
154 { |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
155 super(StmtType.While); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
156 this.cond = cond; |
46 | 157 this.whileBody = stmts; |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
158 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
159 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
160 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
|
161 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
162 cond = cond.simplify(); |
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
163 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
|
164 } |
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
|
165 |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
166 Exp cond; |
46 | 167 Stmt whileBody; |
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 |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
170 class SwitchStmt : Stmt |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
171 { |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
172 this(Exp target) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
173 { |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
174 super(StmtType.Switch); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
175 cond = target; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
176 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
177 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
178 void addCase(IntegerLit[] values, Stmt[] stmts) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
179 { |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
180 long[] new_values; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
181 foreach (lit; values) |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
64
diff
changeset
|
182 new_values ~= Integer.parse(lit.get); |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
183 cases ~= Case(values, stmts, new_values); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
184 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
185 // Make sure there is no two cases with the same value |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
186 // Does it belong here? |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
187 new_values = new_values.dup; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
188 Array.sort(new_values); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
189 long[] all_values = Array.unionOf(old_values, new_values); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
190 if (all_values.length != old_values.length + new_values.length) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
191 { |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
192 // overlap! |
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
|
193 // TODO: Move this to another sema file where it can be enforced. |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
194 /+ auto e = new Error( |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
195 "Can't have multiple cases with the same value." |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
196 " Values appearing in multiple cases: %0"); |
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
|
197 |
88
eb5b2c719a39
Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents:
64
diff
changeset
|
198 //e.loc(values[0].token.location); |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
199 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
200 all_values = Array.intersectionOf(old_values, new_values); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
201 char[][] vals; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
202 foreach (val; all_values) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
203 vals ~= Integer.toString(val); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
204 e.arg(vals); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
205 /* |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
206 foreach (c; cases) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
207 foreach (i, v; c.values_converted) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
208 if (Array.bsearch(all_values, v)) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
209 e.tok(c.values[i].token); |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
210 */ |
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
|
211 throw e;+/ |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
212 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
213 old_values = all_values; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
214 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
215 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
216 void setDefault(Stmt[] stmts) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
217 { |
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
|
218 // TODO: Move this to another sema file where it can be enforced. |
3a0cd42de9cc
Removed misc/Error.d and is now using the error system all way through.
Anders Johnsen <skabet@gmail.com>
parents:
92
diff
changeset
|
219 /* |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
220 if (defaultBlock.length != 0) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
221 throw new Error("Switch statements can't have multiple defaults"); |
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
|
222 */ |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
223 defaultBlock = stmts; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
224 if (cases.length > 0) |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
225 cases[$ - 1].followedByDefault = true; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
226 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
227 |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
228 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
|
229 { |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
230 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
|
231 foreach ( stmt ; defaultBlock ) |
139
a22e3663de89
Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents:
126
diff
changeset
|
232 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
|
233 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
|
234 foreach ( stmt ; c.stmts ) |
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 } |
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 |
36
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
238 Exp cond; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
239 Case[] cases; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
240 Stmt[] defaultBlock; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
241 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
242 struct Case |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
243 { |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
244 IntegerLit[] values; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
245 Stmt[] stmts; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
246 long[] values_converted; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
247 bool followedByDefault = false; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
248 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
249 |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
250 private long[] old_values; |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
251 } |
ce17bea8e9bd
Switch statements support
Anders Halager <halager@gmail.com>
parents:
11
diff
changeset
|
252 |