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;
|
|
44 push();
|
|
45 d.env = current();
|
|
46 super.visitFuncDecl(d);
|
|
47 pop();
|
|
48 }
|
|
49
|
|
50 override void visitVarDecl(VarDecl d)
|
|
51 {
|
|
52 auto sc = current();
|
|
53 auto sym = sc.add(d.identifier);
|
|
54 sym.type = d.type;
|
|
55 super.visitVarDecl(d);
|
|
56 }
|
|
57
|
|
58 private:
|
|
59 Scope[] table;
|
|
60
|
|
61 void push()
|
|
62 {
|
|
63 table ~= new Scope(current());
|
|
64 }
|
|
65
|
|
66 Scope pop()
|
|
67 {
|
|
68 auto res = table[$ - 1];
|
|
69 table.length = table.length - 1;
|
|
70 return res;
|
|
71 }
|
|
72
|
|
73 Scope current()
|
|
74 {
|
|
75 return table[$ - 1];
|
|
76 }
|
|
77 }
|
|
78
|