Mercurial > projects > dang
annotate sema/SymbolTableBuilder.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 | ae5bbe4e7fd6 |
children | a51bdf15a33d |
rev | line source |
---|---|
1 | 1 module sema.SymbolTableBuilder; |
2 | |
3 import tango.io.Stdout; | |
4 | |
5 public import sema.SymbolTable; | |
6 | |
7 import sema.Visitor; | |
8 | |
9 class SymbolTableBuilder : Visitor!(void) | |
10 { | |
11 this() | |
12 { | |
13 table ~= new Scope; | |
14 } | |
15 | |
16 override void visit(Decl[] decls) | |
17 { | |
18 foreach (decl; decls) | |
19 visitDecl(decl); | |
20 } | |
21 | |
22 override void visitDecl(Decl d) | |
23 { | |
24 d.env = current(); | |
25 super.visitDecl(d); | |
26 } | |
27 | |
28 override void visitStmt(Stmt s) | |
29 { | |
30 s.env = current(); | |
31 super.visitStmt(s); | |
32 } | |
33 | |
34 override void visitExp(Exp e) | |
35 { | |
36 e.env = current(); | |
37 super.visitExp(e); | |
38 } | |
39 | |
40 override void visitFuncDecl(FuncDecl d) | |
41 { | |
42 auto sym = current().add(d.identifier); | |
43 sym.type = d.type; | |
2
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
44 visitExp(d.type); |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
45 visitExp(d.identifier); |
1 | 46 d.env = current(); |
2
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
47 push(); |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
48 current().parentFunction = sym; |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
49 foreach (arg; d.funcArgs) |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
50 visitDecl(arg); |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
51 foreach (stmt; d.statements) |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
52 visitStmt(stmt); |
1 | 53 pop(); |
54 } | |
55 | |
56 override void visitVarDecl(VarDecl d) | |
57 { | |
58 auto sc = current(); | |
59 auto sym = sc.add(d.identifier); | |
60 sym.type = d.type; | |
61 super.visitVarDecl(d); | |
62 } | |
63 | |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
64 override void visitIfStmt(IfStmt s) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
65 { |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
66 s.env = current(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
67 visitExp(s.cond); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
68 push(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
69 foreach (stmt; s.then_body) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
70 visitStmt(stmt); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
71 pop(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
72 |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
73 push(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
74 foreach (stmt; s.else_body) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
75 visitStmt(stmt); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
76 pop(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
77 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
78 |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
79 override void visitWhileStmt(WhileStmt s) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
80 { |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
81 s.env = current(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
82 push(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
83 super.visitWhileStmt(s); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
84 pop(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
85 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
86 |
1 | 87 private: |
88 Scope[] table; | |
89 | |
90 void push() | |
91 { | |
92 table ~= new Scope(current()); | |
93 } | |
94 | |
95 Scope pop() | |
96 { | |
97 auto res = table[$ - 1]; | |
98 table.length = table.length - 1; | |
99 return res; | |
100 } | |
101 | |
102 Scope current() | |
103 { | |
104 return table[$ - 1]; | |
105 } | |
106 } | |
107 |