annotate ast/Stmt.d @ 59:1d6f4ad38a91 new_gen

Make most of the tests pass again Still have two bugs, one is that type conversion has been diabled for return statements, the other is at line ~540 of CodeGen.d, were the following error is emitted: Can't find an implicit conversion between { i32 } and i32
author Anders Halager <halager@gmail.com>
date Tue, 29 Apr 2008 00:31:56 +0200
parents 43bb0a36b869
children 91f10c34cd7b
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
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
10 import sema.SymbolTable,
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
11 misc.Error;
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
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
49 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
50 {
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 foreach ( stmt ; 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
52 stmt.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
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
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
65 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
66 {
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 FuncDecl f = env.parentFunction;
59
1d6f4ad38a91 Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents: 57
diff changeset
68 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
69 {
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
70 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
71 i.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
72 auto ass = new AssignExp(i, exp);
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 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
74 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
75 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
76
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 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
78 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
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 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
81 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
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 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
84 }
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 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
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 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
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 if(exp)
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.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
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
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
104 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
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 decl.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
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
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
120 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
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 exp = exp.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
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
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
138 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
139 {
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 cond.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
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)
1d6f4ad38a91 Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents: 57
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
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
160 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
161 {
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 cond.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
163 whileBody.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
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)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
182 new_values ~= Integer.parse(lit.token.get);
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!
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
193 auto e = new Error(
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
194 "Can't have multiple cases with the same value."
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
195 " Values appearing in multiple cases: %0");
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
196 e.loc(values[0].token.location);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
197
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
198 all_values = Array.intersectionOf(old_values, new_values);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
199 char[][] vals;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
200 foreach (val; all_values)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
201 vals ~= Integer.toString(val);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
202 e.arg(vals);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
203 /*
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
204 foreach (c; cases)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
205 foreach (i, v; c.values_converted)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
206 if (Array.bsearch(all_values, v))
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
207 e.tok(c.values[i].token);
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
208 */
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
209 throw e;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
210 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
211 old_values = all_values;
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
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
214 void setDefault(Stmt[] stmts)
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 if (defaultBlock.length != 0)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
217 throw new Error("Switch statements can't have multiple defaults");
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
218 defaultBlock = stmts;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
219 if (cases.length > 0)
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
220 cases[$ - 1].followedByDefault = true;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
221 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
222
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
223 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
224 {
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
225 cond.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
226 foreach ( stmt ; defaultBlock )
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
227 stmt.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
228 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
229 foreach ( stmt ; c.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
230 stmt.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
231 }
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
36
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
233 Exp cond;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
234 Case[] cases;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
235 Stmt[] defaultBlock;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
236
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
237 struct Case
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 IntegerLit[] values;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
240 Stmt[] stmts;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
241 long[] values_converted;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
242 bool followedByDefault = false;
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
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
245 private long[] old_values;
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
246 }
ce17bea8e9bd Switch statements support
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
247