Mercurial > projects > dang
annotate sema/Visitor.d @ 22:e331e4e816e4
now handling structs to some extend
author | johnsen@johnsen-laptop |
---|---|
date | Fri, 18 Apr 2008 23:45:45 +0200 |
parents | 642c6a998fd9 |
children | 69464d465284 |
rev | line source |
---|---|
1 | 1 module sema.Visitor; |
2 | |
3 import tango.io.Stdout; | |
4 | |
5 public | |
6 import ast.Decl, | |
7 ast.Stmt, | |
8 ast.Exp; | |
9 | |
10 import lexer.Token; | |
11 | |
12 class Visitor(FinalT = int, DeclT = FinalT, StmtT = DeclT, ExpT = StmtT) | |
13 { | |
14 public: | |
15 FinalT visit(Decl[] decls) | |
16 { | |
17 foreach (decl; decls) | |
18 visitDecl(decl); | |
19 static if (is(FinalT == void)) | |
20 return; | |
21 else | |
22 return FinalT.init; | |
23 } | |
24 | |
25 DeclT visitDecl(Decl decl) | |
26 { | |
27 switch(decl.declType) | |
28 { | |
29 case DeclType.FuncDecl: | |
30 return visitFuncDecl(cast(FuncDecl)decl); | |
31 case DeclType.VarDecl: | |
32 return visitVarDecl(cast(VarDecl)decl); | |
22 | 33 case DeclType.StructDecl: |
34 return visitStructDecl(cast(StructDecl)decl); | |
1 | 35 default: |
36 throw new Exception("Unknown declaration type"); | |
37 } | |
38 } | |
39 | |
40 StmtT visitStmt(Stmt stmt) | |
41 { | |
42 switch(stmt.stmtType) | |
43 { | |
44 case StmtType.Return: | |
45 return visitReturnStmt(cast(ReturnStmt)stmt); | |
46 case StmtType.Decl: | |
47 return visitDeclStmt(cast(DeclStmt)stmt); | |
48 case StmtType.Exp: | |
49 return visitExpStmt(cast(ExpStmt)stmt); | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
50 case StmtType.If: |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
51 return visitIfStmt(cast(IfStmt)stmt); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
52 case StmtType.While: |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
53 return visitWhileStmt(cast(WhileStmt)stmt); |
1 | 54 default: |
55 throw new Exception("Unknown statement type"); | |
56 } | |
57 } | |
58 | |
59 ExpT visitExp(Exp exp) | |
60 { | |
61 switch(exp.expType) | |
62 { | |
63 case ExpType.Binary: | |
64 return visitBinaryExp(cast(BinaryExp)exp); | |
65 case ExpType.IntegerLit: | |
66 return visitIntegerLit(cast(IntegerLit)exp); | |
67 case ExpType.Negate: | |
68 return visitNegateExp(cast(NegateExp)exp); | |
69 case ExpType.AssignExp: | |
70 return visitAssignExp(cast(AssignExp)exp); | |
71 case ExpType.CallExp: | |
72 return visitCallExp(cast(CallExp)exp); | |
73 case ExpType.Identifier: | |
74 return visitIdentifier(cast(Identifier)exp); | |
75 default: | |
76 throw new Exception("Unknown expression type"); | |
77 } | |
78 } | |
79 | |
80 // Declarations: | |
81 DeclT visitVarDecl(VarDecl d) | |
82 { | |
83 visitExp(d.type); | |
84 visitExp(d.identifier); | |
85 if (d.init) | |
86 visitExp(d.init); | |
87 | |
88 static if (is(DeclT == void)) | |
89 return; | |
90 else | |
91 return DeclT.init; | |
92 } | |
93 | |
94 DeclT visitFuncDecl(FuncDecl f) | |
95 { | |
96 visitExp(f.type); | |
97 visitExp(f.identifier); | |
98 foreach (arg; f.funcArgs) | |
99 visitDecl(arg); | |
100 foreach (stmt; f.statements) | |
101 visitStmt(stmt); | |
102 | |
103 static if (is(DeclT == void)) | |
104 return; | |
105 else | |
106 return DeclT.init; | |
107 } | |
108 | |
22 | 109 DeclT visitStructDecl(StructDecl s) |
110 { | |
111 visitExp(s.identifier); | |
112 | |
113 foreach (arg; s.vars) | |
114 visitDecl(arg); | |
115 | |
116 static if (is(DeclT == void)) | |
117 return; | |
118 else | |
119 return DeclT.init; | |
120 } | |
121 | |
1 | 122 // Statements: |
123 StmtT visitReturnStmt(ReturnStmt s) | |
124 { | |
125 visitExp(s.exp); | |
126 static if (is(StmtT == void)) | |
127 return; | |
128 else | |
129 return StmtT.init; | |
130 } | |
131 | |
132 StmtT visitDeclStmt(DeclStmt d) | |
133 { | |
134 visitDecl(d.decl); | |
135 static if (is(StmtT == void)) | |
136 return; | |
137 else | |
138 return StmtT.init; | |
139 } | |
140 | |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
141 StmtT visitIfStmt(IfStmt s) |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
142 { |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
143 visitExp(s.cond); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
144 foreach (stmt; s.then_body) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
145 visitStmt(stmt); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
146 foreach (stmt; s.else_body) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
147 visitStmt(stmt); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
148 static if (is(StmtT == void)) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
149 return; |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
150 else |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
151 return StmtT.init; |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
152 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
153 |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
154 StmtT visitWhileStmt(WhileStmt s) |
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 visitExp(s.cond); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
5
diff
changeset
|
157 foreach (stmt; s.stmts) |
5
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
158 visitStmt(stmt); |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
159 static if (is(StmtT == void)) |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
160 return; |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
161 else |
2c5a8f4c254a
Added very simple if support.
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
162 return StmtT.init; |
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 |
1 | 165 StmtT visitExpStmt(ExpStmt s) |
166 { | |
167 visitExp(s.exp); | |
168 static if (is(StmtT == void)) | |
169 return; | |
170 else | |
171 return StmtT.init; | |
172 } | |
173 | |
174 // Expressions: | |
175 ExpT visitAssignExp(AssignExp exp) | |
176 { | |
177 visitExp(exp.identifier); | |
178 visitExp(exp.exp); | |
179 static if (is(ExpT == void)) | |
180 return; | |
181 else | |
182 return ExpT.init; | |
183 } | |
184 | |
185 ExpT visitBinaryExp(BinaryExp exp) | |
186 { | |
187 visitExp(exp.left); | |
188 visitExp(exp.right); | |
189 static if (is(ExpT == void)) | |
190 return; | |
191 else | |
192 return ExpT.init; | |
193 } | |
194 | |
195 ExpT visitCallExp(CallExp exp) | |
196 { | |
197 visitExp(exp.exp); | |
198 foreach (arg; exp.args) | |
199 visitExp(arg); | |
200 static if (is(ExpT == void)) | |
201 return; | |
202 else | |
203 return ExpT.init; | |
204 } | |
205 | |
206 ExpT visitNegateExp(NegateExp exp) | |
207 { | |
208 visitExp(exp.exp); | |
209 static if (is(ExpT == void)) | |
210 return; | |
211 else | |
212 return ExpT.init; | |
213 } | |
214 | |
215 ExpT visitIntegerLit(IntegerLit exp) | |
216 { | |
217 static if (is(ExpT == void)) | |
218 return; | |
219 else | |
220 return ExpT.init; | |
221 } | |
222 | |
223 ExpT visitIdentifier(Identifier exp) | |
224 { | |
225 static if (is(ExpT == void)) | |
226 return; | |
227 else | |
228 return ExpT.init; | |
229 } | |
230 } | |
231 |