annotate ast/Stmt.d @ 149:393a1f47a6d2

For loops in AST and sema. Should have correct scope and such now.
author Anders Johnsen <skabet@gmail.com>
date Mon, 21 Jul 2008 21:00:20 +0200
parents d76cc5cad4fc
children ee202c72cd30
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,
149
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
22 For,
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
23 Switch,
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
24 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
26 class Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
27 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
28 this(StmtType stmtType = StmtType.Stmt)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
29 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
30 this.stmtType = stmtType;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
31 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
32
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
33 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
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 }
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
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
37 StmtType stmtType;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
38 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
39 int stmtIndex;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
40 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
41
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
42 class CompoundStatement : Stmt
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
43 {
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
44 this(Stmt[] stmts)
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
45 {
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
46 super(StmtType.Compound);
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
47 this.statements = stmts;
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
48 }
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
49
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
50 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
51 {
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
52 foreach (stmt; statements )
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
53 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
54 }
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
55
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
56 Stmt[] statements;
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
57 }
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 36
diff changeset
58
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
59 class ReturnStmt : Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
60 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
61 this()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
62 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
63 super(StmtType.Return);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
64 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
65
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
66 // Needed?
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
67 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
68 {
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
69 FuncDecl f = env.parentFunction;
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
70 if (exp)
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
71 exp = exp.simplify();
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
72 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
73 {
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 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
75 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
76 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
77 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
78 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
79 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
80
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 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
82 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
83 {
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 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
85 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
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 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
88 }
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 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
90 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
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 }
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
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
94 public Exp exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
95 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
96
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
97 class DeclStmt : Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
98 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
99 this(Decl decl)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
100 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
101 super(StmtType.Decl);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
102 this.decl = decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
103 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
104
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
105 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
106 {
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
107 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
108 }
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
109
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
110 public Decl decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
111 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
112
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
113 class ExpStmt : Stmt
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
114 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
115 this(Exp exp)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
116 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
117 super(StmtType.Exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
118 this.exp = exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
119 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
120
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
121 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
122 {
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
123 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
124 }
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
125
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
126 public Exp exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
127 }
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
128
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
129 class IfStmt : Stmt
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
130 {
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
131 this(Exp cond, Stmt then, Stmt el = null)
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
132 {
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
133 super(StmtType.If);
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
134 this.cond = cond;
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
135 this.then_body = then;
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
136 this.else_body = el;
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
137 }
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
138
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
139 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
140 {
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
141 cond = cond.simplify();
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
142 then_body.simplify();
59
1d6f4ad38a91 Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents: 57
diff changeset
143 if (else_body)
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
144 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
145 }
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
146
5
2c5a8f4c254a Added very simple if support.
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
147 Exp cond;
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
148 Stmt then_body;
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
149 Stmt else_body;
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
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
152 class WhileStmt : Stmt
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
153 {
46
90fb4fdfefdd While is back
Anders Halager <halager@gmail.com>
parents: 45
diff changeset
154 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
155 {
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
156 super(StmtType.While);
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
157 this.cond = cond;
46
90fb4fdfefdd While is back
Anders Halager <halager@gmail.com>
parents: 45
diff changeset
158 this.whileBody = stmts;
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
159 }
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
160
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
161 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
162 {
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
163 cond = cond.simplify();
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
164 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
165 }
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
166
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
167 Exp cond;
46
90fb4fdfefdd While is back
Anders Halager <halager@gmail.com>
parents: 45
diff changeset
168 Stmt whileBody;
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
169 }
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 5
diff changeset
170
149
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
171 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
172 {
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
173 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
174 {
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
175 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
176 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
177 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
178 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
179 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
180 }
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
181
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
182 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
183 {
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
184 cond = cond.simplify();
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
185 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
186 }
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 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
189 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
190 }
393a1f47a6d2 For loops in AST and sema. Should have correct scope and such now.
Anders Johnsen <skabet@gmail.com>
parents: 143
diff changeset
191
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
192 class SwitchStmt : Stmt
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
193 {
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
194 this(Exp target)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
195 {
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
196 super(StmtType.Switch);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
197 cond = target;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
198 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
199
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
200 void addCase(Exp[] values, Stmt[] stmts)
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
201 {
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
202 // long[] new_values;
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
203 // foreach (lit; values)
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
204 // new_values ~= Integer.parse(lit.get);
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
205 // cases ~= Case(values, stmts, new_values);
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
206 cases ~= Case(values, stmts);
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
207
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
208 // Make sure there is no two cases with the same value
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
209 // Does it belong here?
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
210 /+ new_values = new_values.dup;
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
211 Array.sort(new_values);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
212 long[] all_values = Array.unionOf(old_values, new_values);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
213 if (all_values.length != old_values.length + new_values.length)
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 // 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
216 // 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
217 /+ auto e = new Error(
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
218 "Can't have multiple cases with the same value."
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
219 " 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
220
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 64
diff changeset
221 //e.loc(values[0].token.location);
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
222
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
223 all_values = Array.intersectionOf(old_values, new_values);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
224 char[][] vals;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
225 foreach (val; all_values)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
226 vals ~= Integer.toString(val);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
227 e.arg(vals);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
228 /*
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
229 foreach (c; cases)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
230 foreach (i, v; c.values_converted)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
231 if (Array.bsearch(all_values, v))
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
232 e.tok(c.values[i].token);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
233 */
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
234 throw e;+/
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
235 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
236 old_values = all_values;
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
237 +/
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
238 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
239
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
240 void setDefault(Stmt[] stmts)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
241 {
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
242 // 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
243 /*
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
244 if (defaultBlock.length != 0)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
245 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
246 */
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
247 defaultBlock = stmts;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
248 if (cases.length > 0)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
249 cases[$ - 1].followedByDefault = true;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
250 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
251
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
252 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
253 {
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
254 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
255 foreach ( stmt ; defaultBlock )
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
256 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
257 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
258 foreach ( stmt ; c.stmts )
139
a22e3663de89 Fixed up our simplify functions
Anders Halager <halager@gmail.com>
parents: 126
diff changeset
259 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
260 }
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
261
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
262 Exp cond;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
263 Case[] cases;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
264 Stmt[] defaultBlock;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
265
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
266 struct Case
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
267 {
143
d76cc5cad4fc Added partial support for switches.
Anders Johnsen <skabet@gmail.com>
parents: 139
diff changeset
268 Exp[] values;
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
269 Stmt[] stmts;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
270 long[] values_converted;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
271 bool followedByDefault = false;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
272 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
273
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
274 private long[] old_values;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
275 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
276