annotate ast/Stmt.d @ 183:8ea749b7da91

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