Mercurial > projects > dang
annotate dang/compiler.d @ 68:381975d76baf new_gen
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Thu, 01 May 2008 19:25:49 +0200 |
parents | 2451f0904bf6 |
children | 9a35a973175a |
rev | line source |
---|---|
1 | 1 module dang.compiler; |
2 | |
3 import tango.io.Stdout, | |
4 tango.core.Signal, | |
5 tango.io.FilePath; | |
6 | |
7 import lexer.Lexer, | |
8 parser.Parser; | |
9 | |
10 import misc.DataSource; | |
11 | |
12 import ast.Decl; | |
13 | |
14 import tools.AstPrinter, | |
15 tools.DotPrinter; | |
16 | |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
50
diff
changeset
|
17 import gen.CodeGen; |
1 | 18 |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
19 import sema.Visitor, |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
50
diff
changeset
|
20 sema.AstAction, |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
21 sema.SymbolTableBuilder, |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
60
diff
changeset
|
22 sema.ImplicitCast, |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
23 sema.Declarations; |
1 | 24 |
25 import dang.OptParse; | |
26 | |
27 void checkFiles(char[][] *files) | |
28 { | |
29 bool error = false; | |
30 | |
31 char[][] validFiles; | |
32 | |
33 foreach(file ; *files) | |
34 { | |
35 auto path = new FilePath(file); | |
36 | |
37 if(!path.exists) | |
38 { | |
39 Stdout("File '"~file~"' does not exists").newline; | |
40 error = true; | |
41 | |
42 continue; | |
43 } | |
44 | |
45 bool fileInStack = false; | |
46 foreach(vFile ; validFiles) | |
47 if(vFile == file) | |
48 fileInStack = true; | |
49 | |
50 if(fileInStack) | |
51 continue; | |
52 | |
53 validFiles ~= file; | |
54 } | |
55 | |
56 *files = validFiles; | |
57 | |
58 if(error) | |
59 throw new Exception("Some file(s) did not exist"); | |
60 } | |
61 void main(char[][] args) | |
62 { | |
63 char[][] filesToHandle; | |
64 | |
65 Signal!(char[][]*) preStart; | |
66 | |
67 Signal!(char[]) preLex; | |
68 Signal!(Lexer) postLex; | |
69 | |
70 Signal!(Lexer) preParse; | |
71 Signal!(Decl[], DataSource) postParse; | |
72 | |
73 preStart.attach(&checkFiles); | |
74 | |
75 auto argParse = new OptionParser; | |
76 | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
77 bool optimize = false; |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
78 bool inline = false; |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
79 |
1 | 80 argParse.addOption( |
81 ["-h", "--help"],{ | |
82 argParse.helpText(); | |
83 return; | |
84 } | |
85 ).help("Show this help message"); | |
86 | |
87 argParse.addOption( | |
88 ["--ast-dump-dot"], { | |
89 postParse.attach( | |
90 (Decl[] decls, DataSource src) { | |
91 auto print = new DotPrinter(); | |
92 print.print(decls); | |
60
2451f0904bf6
Dumping Ast with AstPrinter is now possible again! :)
Anders Johnsen <skabet@gmail.com>
parents:
56
diff
changeset
|
93 exit(0); |
1 | 94 }); |
95 } | |
96 ).help("Output the AST as dot-graphicz"); | |
97 | |
98 argParse.addOption( | |
99 ["--ast-dump-code"], { | |
100 postParse.attach( | |
101 (Decl[] decls, DataSource src) { | |
102 auto print = new AstPrinter(src); | |
103 print.print(decls); | |
60
2451f0904bf6
Dumping Ast with AstPrinter is now possible again! :)
Anders Johnsen <skabet@gmail.com>
parents:
56
diff
changeset
|
104 exit(0); |
1 | 105 }); |
106 } | |
107 ).help("Output the AST as dot-graphicz"); | |
108 | |
109 argParse.addOption( | |
110 ["--gen-llvm"], { | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
111 /* postParse.attach( |
1 | 112 (Decl[] decls, DataSource src) { |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
50
diff
changeset
|
113 auto llvmGen = new CodeGen(); |
1 | 114 llvmGen.gen(decls); |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
115 }); */ |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
116 } |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
117 ).help("Compile to LLVM code (default)"); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
118 |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
119 argParse.addOption( |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
120 ["-O","--optimize"], { |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
121 optimize = true; |
1 | 122 } |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
123 ).help("Optimize code when compiling to LLVM"); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
124 |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
125 argParse.addOption( |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
126 ["--inline"], { |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
127 inline = true; |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
128 } |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
129 ).help("Inline functions when compiling to LLVM"); |
1 | 130 |
131 auto options = argParse.parse(args); | |
132 | |
133 filesToHandle ~= options.args; | |
134 | |
135 try | |
136 { | |
137 preStart(&filesToHandle); | |
138 } | |
139 catch(Exception e) | |
140 { | |
141 return; | |
142 } | |
143 | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
144 postParse.attach( |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
145 (Decl[] decls, DataSource src) { |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
50
diff
changeset
|
146 auto llvmGen = new CodeGen(); |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
147 llvmGen.gen(decls, optimize, inline); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
148 }); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
149 |
1 | 150 foreach(file ; filesToHandle) |
151 { | |
152 preLex(file); | |
153 | |
154 auto src = DataSource(file); | |
155 auto lexer = new Lexer(src); | |
22 | 156 /* |
157 auto t = lexer.next; | |
158 while(t.getType != "EOF") | |
159 { | |
160 Stdout(t.getType)(" : ")(t.get).newline; | |
161 t = lexer.next; | |
162 } | |
163 lexer = new Lexer(src); | |
164 */ | |
1 | 165 postLex(lexer); |
166 | |
167 preParse(lexer); | |
168 | |
169 auto parser = new Parser; | |
51
c96cdcbdb9d6
Rearranged some stuff, and renamed LLVMGen -> CodeGen
Anders Halager <halager@gmail.com>
parents:
50
diff
changeset
|
170 auto decls = cast(Decl[])parser.parse(lexer, new AstAction); |
1 | 171 |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
172 (new SymbolTableBuilder).visit(decls); |
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
173 (new Declarations).visit(decls); |
68
381975d76baf
A LOT of bug fixing - also implemented implicit casts. If you do a --ast-dump-code on a target with some algebra of differant types, you should now see the type casts being made. Also, Tests are again back with only switches failing...
Anders Johnsen <skabet@gmail.com>
parents:
60
diff
changeset
|
174 (new ImplicitCast).visit(decls); |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
175 |
56
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
51
diff
changeset
|
176 foreach(decl ; decls) |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
51
diff
changeset
|
177 decl.simplify(); |
4ae365eff712
Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents:
51
diff
changeset
|
178 |
1 | 179 postParse(decls, src); |
180 } | |
181 | |
182 /* if (args.length > 1 && args[1] == "lex") | |
183 { | |
184 Token t; | |
185 | |
186 t = lexer.next(); | |
187 while(t.type != Tok.EOF) | |
188 { | |
189 Stdout(src.get(t.position, t.length)).newline; | |
190 t = lexer.next(); | |
191 } | |
192 } | |
193 else | |
194 { | |
195 auto decl = parser.parse(lexer); | |
196 if(args.length > 1 && args[1] == "dump-ast") | |
197 { | |
198 auto buffer = new AstBuffer(src.data); | |
199 decl.print(buffer); | |
200 } | |
201 }*/ | |
202 } |