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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1 module ast.Stmt;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
7 import ast.Exp,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
8 ast.Decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
12
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
13 enum StmtType
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
17 Decl,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
18 Exp,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
23 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
24
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25 class Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
26 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
27 this(StmtType stmtType = StmtType.Stmt)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
28 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
29 this.stmtType = stmtType;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
30 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
36 StmtType stmtType;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
39 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
58 class ReturnStmt : Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
59 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
60 this()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
61 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
62 super(StmtType.Return);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
63 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
93 public Exp exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
94 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
95
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
96 class DeclStmt : Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
97 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
98 this(Decl decl)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
99 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
100 super(StmtType.Decl);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
101 this.decl = decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
102 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
109 public Decl decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
110 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
111
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
112 class ExpStmt : Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
113 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
114 this(Exp exp)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
115 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
116 super(StmtType.Exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
117 this.exp = exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
118 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
125 public Exp exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
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
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
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
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
147 Stmt then_body;
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
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
90fb4fdfefdd While is back
Anders Halager <halager@gmail.com>
parents: 45
diff changeset
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
90fb4fdfefdd While is back
Anders Halager <halager@gmail.com>
parents: 45
diff changeset
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
90fb4fdfefdd While is back
Anders Halager <halager@gmail.com>
parents: 45
diff changeset
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