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