annotate tools/DotPrinter.d @ 94:48bb2287c035 new_gen

Added Modules. Right now it's very simple - will grow with time and need.
author Anders Johnsen <skabet@gmail.com>
date Tue, 06 May 2008 16:24:14 +0200
parents eb5b2c719a39
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
1 module tools.DotPrinter;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
2
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
3 import tango.io.Stdout,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
4 Int = tango.text.convert.Integer;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
5
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
6 import ast.Module,
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
7 ast.Decl,
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
8 ast.Stmt,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
9 ast.Exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
10
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
11 class DotPrinter
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
12 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
13 this()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
15 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
16
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
17 private char[][void*] identifiers;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
18 private int current_id = 0;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
19
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
20 void print(Module m)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
21 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
22 Stdout("digraph {").newline;
94
48bb2287c035 Added Modules. Right now it's very simple - will grow with time and need.
Anders Johnsen <skabet@gmail.com>
parents: 88
diff changeset
23 foreach(decl ; m.decls)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
24 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25 printDecl(decl);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
26 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
27 Stdout("}").newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
28 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
29
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
30 void printDecl(Decl decl)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
31 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
32 switch(decl.declType)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
33 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
34 case DeclType.FuncDecl:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
35 FuncDecl funcDecl = cast(FuncDecl)decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
36
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
37 //printIdentifier(funcDecl.identifier);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
38 //printFuncArgs(funcDecl.funcArgs);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
39 Stdout(dotId(decl))(` [label="function`);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
40 Stdout(`\n name: `)(text(funcDecl.identifier));
63
9f8131676242 Now Decl's have a DType type(), and should use varType and returnType to get the old type id
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
41 Stdout(`\n return type: `)(text(funcDecl.returnType));
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
42 Stdout(`", shape=box, fillcolor=lightblue, style=filled]`);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
43 Stdout.newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
44 //Stdout(`"`);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
45 foreach(stmt ; funcDecl.statements)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
46 printStatement(dotId(decl), stmt);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
47 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
48
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
49 case DeclType.VarDecl:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
50 VarDecl varDecl = cast(VarDecl)decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
51
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
52 //printIdentifier(funcDecl.identifier);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
53 //printFuncArgs(funcDecl.funcArgs);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
54 Stdout(dotId(decl))(` [label="var`);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
55 Stdout(`\n name: `)(text(varDecl.identifier));
63
9f8131676242 Now Decl's have a DType type(), and should use varType and returnType to get the old type id
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
56 Stdout(`\n type: `)(text(varDecl.varType));
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
57 Stdout(`"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
58
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
59 if (varDecl.init !is null)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
60 printExpression(dotId(decl), varDecl.init);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
61 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
62 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
63 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
64
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
65 void printStatement(char[] parent, Stmt stmt)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
66 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
67 auto id = dotId(stmt);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
68 switch (stmt.stmtType)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
69 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
70 case StmtType.Stmt:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
71 Stdout(id)(` [label="Statement"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
72 Stdout(parent)(` -> `)(id).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
73 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
74
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
75 case StmtType.Decl:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
76 Stdout(id)(` [label="Decl"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
77 Stdout(parent)(` -> `)(id).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
78 auto decl = (cast(DeclStmt)stmt).decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
79 printDecl(decl);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
80 Stdout(id)(` -> `)(dotId(decl)).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
81 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
82
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
83 case StmtType.Return:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
84 Stdout(id)(` [label="Return"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
85 Stdout(parent)(` -> `)(id).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
86 printExpression(id, (cast(ReturnStmt)stmt).exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
87 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
88
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
89 case StmtType.Exp:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
90 Stdout(parent)(` -> `)(id).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
91 printExpression(id, (cast(ExpStmt)stmt).exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
92 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
93 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
94 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
95
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
96 void printExpression(char[] parent, Exp exp)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
97 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
98 auto id = dotId(exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
99
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
100 switch(exp.expType)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
101 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
102 case ExpType.Binary:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
103 auto bin = cast(BinaryExp)exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
104 Stdout(id)(` [label="`)(bin.op)(`"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
105 printExpression(id, bin.left);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
106 printExpression(id, bin.right);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
107 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
108
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
109 case ExpType.Negate:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
110 auto neg = cast(NegateExp)exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
111 Stdout(id)(` [label="Negate"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
112 printExpression(id, neg.exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
113 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
114
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
115 case ExpType.IntegerLit:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
116 auto e = cast(IntegerLit)exp;
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 63
diff changeset
117 Stdout(id)(` [label="`)(text(e.get))(`"]`).newline;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
118 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
119
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
120 case ExpType.Identifier:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
121 auto e = cast(Identifier)exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
122 Stdout(id)(` [label="`)(text(e))(`"]`).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
123 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
124
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
125 case ExpType.AssignExp:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
126 auto ass = cast(AssignExp)exp;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
127 Stdout(parent)(` [label="Assign"]`).newline;
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 1
diff changeset
128 // Stdout(id)(` [label="`)(text(ass.identifier))(`"]`).newline;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
129 printExpression(parent, ass.exp);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
130 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
131
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
132 case ExpType.CallExp:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
133 break;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
134 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
135 Stdout(parent)(` -> `)(id).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
136 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
137
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
138 char[] dotId(Decl d) { return dotId(cast(void*)d); }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
139 char[] dotId(Stmt s) { return dotId(cast(void*)s); }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
140 char[] dotId(Exp e) { return dotId(cast(void*)e); }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
141
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
142 char[] dotId(void* o)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
143 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
144 auto id = o in identifiers;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
145 if (id is null)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
146 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
147 ++current_id;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
148 identifiers[o] = Int.toString(current_id);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
149 id = o in identifiers;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
150 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
151 return *id;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
152 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
153
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
154 char[] text(Identifier identifier)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
155 {
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 63
diff changeset
156 return identifier.get;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
157 }
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 63
diff changeset
158 char[] text(char[] t)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
159 {
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 63
diff changeset
160 return t;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
161 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
162 }
88
eb5b2c719a39 Major change to locations, tokens and expressions.
Anders Halager <halager@gmail.com>
parents: 63
diff changeset
163