Mercurial > projects > dang
annotate sema/SymbolTableBuilder.d @ 26:b4dc2b2c0e38 new_gen
Added a DType class
author | Anders Halager <halager@gmail.com> |
---|---|
date | Sat, 19 Apr 2008 22:19:14 +0200 |
parents | 2d28b21faad6 |
children | 9031487e97d7 |
rev | line source |
---|---|
1 | 1 module sema.SymbolTableBuilder; |
2 | |
14 | 3 import tango.io.Stdout, |
4 tango.core.Array : find; | |
1 | 5 |
26 | 6 public |
7 import sema.SymbolTable, | |
8 sema.DType; | |
1 | 9 |
10 import sema.Visitor; | |
11 | |
12 class SymbolTableBuilder : Visitor!(void) | |
13 { | |
14 this() | |
15 { | |
16 table ~= new Scope; | |
17 } | |
18 | |
19 override void visit(Decl[] decls) | |
20 { | |
21 foreach (decl; decls) | |
22 visitDecl(decl); | |
23 } | |
24 | |
25 override void visitDecl(Decl d) | |
26 { | |
27 d.env = current(); | |
28 super.visitDecl(d); | |
29 } | |
30 | |
31 override void visitStmt(Stmt s) | |
32 { | |
33 s.env = current(); | |
34 super.visitStmt(s); | |
35 } | |
36 | |
37 override void visitExp(Exp e) | |
38 { | |
39 e.env = current(); | |
40 super.visitExp(e); | |
41 } | |
42 | |
43 override void visitFuncDecl(FuncDecl d) | |
44 { | |
45 auto sym = current().add(d.identifier); | |
26 | 46 sym.type = new DType(d.type, current()); |
2
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
47 visitExp(d.type); |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
48 visitExp(d.identifier); |
1 | 49 d.env = current(); |
14 | 50 auto sc = push(); |
51 sc.parentFunction = sym; | |
2
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
52 foreach (arg; d.funcArgs) |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
53 visitDecl(arg); |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
54 foreach (stmt; d.statements) |
ae5bbe4e7fd6
Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents:
1
diff
changeset
|
55 visitStmt(stmt); |
14 | 56 pop(sc); |
1 | 57 } |
58 | |
59 override void visitVarDecl(VarDecl d) | |
60 { | |
24 | 61 if (d.init) |
62 visitExp(d.init); | |
63 | |
64 if (need_push > 0) { | |
65 push(); | |
66 --need_push; | |
67 } | |
68 | |
1 | 69 auto sc = current(); |
70 auto sym = sc.add(d.identifier); | |
26 | 71 sym.type = new DType(d.type, sc); |
24 | 72 d.env = sc; |
73 visitExp(d.type); | |
74 visitExp(d.identifier); | |
1 | 75 } |
76 | |
22 | 77 override void visitStructDecl(StructDecl s) |
78 { | |
79 auto sc = current(); | |
80 auto sym = sc.add(s.identifier); | |
81 // sym.type = Tok.Struct; | |
82 super.visitStructDecl(s); | |
83 } | |
84 | |
14 | 85 override void visitDeclStmt(DeclStmt d) |
86 { | |
24 | 87 ++need_push; |
14 | 88 super.visitDeclStmt(d); |
89 } | |
24 | 90 private uint need_push = 0; |
14 | 91 |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
92 override void visitIfStmt(IfStmt s) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
93 { |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
94 s.env = current(); |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
95 visitExp(s.cond); |
14 | 96 auto sc = push(); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
97 foreach (stmt; s.then_body) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
98 visitStmt(stmt); |
14 | 99 pop(sc); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
100 |
14 | 101 sc = push(); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
102 foreach (stmt; s.else_body) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
103 visitStmt(stmt); |
14 | 104 pop(sc); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
105 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
106 |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
107 override void visitWhileStmt(WhileStmt s) |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
108 { |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
109 s.env = current(); |
14 | 110 auto sc = push(); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
111 super.visitWhileStmt(s); |
14 | 112 pop(sc); |
11
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
113 } |
642c6a998fd9
Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents:
2
diff
changeset
|
114 |
1 | 115 private: |
116 Scope[] table; | |
117 | |
14 | 118 Scope push() |
1 | 119 { |
14 | 120 auto sc = new Scope(current()); |
121 table ~= sc; | |
122 return sc; | |
1 | 123 } |
124 | |
14 | 125 Scope pop(Scope sc = null) |
1 | 126 { |
14 | 127 if (sc !is null) |
128 { | |
129 table.length = table.find(sc); | |
130 return sc; | |
131 } | |
132 | |
1 | 133 auto res = table[$ - 1]; |
134 table.length = table.length - 1; | |
135 return res; | |
136 } | |
137 | |
138 Scope current() | |
139 { | |
140 return table[$ - 1]; | |
141 } | |
142 } | |
143 |