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