Mercurial > projects > dang
annotate dang/compiler.d @ 40:9fb190ad81a4 new_gen
Added -O and --inline args to Dang.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Tue, 22 Apr 2008 00:31:57 +0200 |
parents | e331e4e816e4 |
children | 495188f9078e |
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 | |
17 import gen.LuaGen, | |
18 gen.LLVMGen; | |
19 | |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
20 import sema.Visitor, |
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
21 sema.SymbolTableBuilder, |
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
22 sema.Declarations; |
1 | 23 |
24 import dang.OptParse; | |
25 | |
26 void checkFiles(char[][] *files) | |
27 { | |
28 bool error = false; | |
29 | |
30 char[][] validFiles; | |
31 | |
32 foreach(file ; *files) | |
33 { | |
34 auto path = new FilePath(file); | |
35 | |
36 if(!path.exists) | |
37 { | |
38 Stdout("File '"~file~"' does not exists").newline; | |
39 error = true; | |
40 | |
41 continue; | |
42 } | |
43 | |
44 bool fileInStack = false; | |
45 foreach(vFile ; validFiles) | |
46 if(vFile == file) | |
47 fileInStack = true; | |
48 | |
49 if(fileInStack) | |
50 continue; | |
51 | |
52 validFiles ~= file; | |
53 } | |
54 | |
55 *files = validFiles; | |
56 | |
57 if(error) | |
58 throw new Exception("Some file(s) did not exist"); | |
59 } | |
60 void main(char[][] args) | |
61 { | |
62 char[][] filesToHandle; | |
63 | |
64 Signal!(char[][]*) preStart; | |
65 | |
66 Signal!(char[]) preLex; | |
67 Signal!(Lexer) postLex; | |
68 | |
69 Signal!(Lexer) preParse; | |
70 Signal!(Decl[], DataSource) postParse; | |
71 | |
72 preStart.attach(&checkFiles); | |
73 | |
74 auto argParse = new OptionParser; | |
75 | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
76 bool optimize = false; |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
77 bool inline = false; |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
78 |
1 | 79 argParse.addOption( |
80 ["-h", "--help"],{ | |
81 argParse.helpText(); | |
82 return; | |
83 } | |
84 ).help("Show this help message"); | |
85 | |
86 argParse.addOption( | |
87 ["--ast-dump-dot"], { | |
88 postParse.attach( | |
89 (Decl[] decls, DataSource src) { | |
90 auto print = new DotPrinter(); | |
91 print.print(decls); | |
92 }); | |
93 } | |
94 ).help("Output the AST as dot-graphicz"); | |
95 | |
96 argParse.addOption( | |
97 ["--ast-dump-code"], { | |
98 postParse.attach( | |
99 (Decl[] decls, DataSource src) { | |
100 auto print = new AstPrinter(src); | |
101 print.print(decls); | |
102 }); | |
103 } | |
104 ).help("Output the AST as dot-graphicz"); | |
105 | |
106 argParse.addOption( | |
107 ["--gen-lua"], { | |
108 postParse.attach( | |
109 (Decl[] decls, DataSource src) { | |
110 auto luaGen = new LuaGen(); | |
111 luaGen.gen(decls); | |
112 }); | |
113 } | |
114 ).help("Compile to Lua code"); | |
115 | |
116 argParse.addOption( | |
117 ["--gen-llvm"], { | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
118 /* postParse.attach( |
1 | 119 (Decl[] decls, DataSource src) { |
120 auto llvmGen = new LLVMGen(); | |
121 llvmGen.gen(decls); | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
122 }); */ |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
123 } |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
124 ).help("Compile to LLVM code (default)"); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
125 |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
126 argParse.addOption( |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
127 ["-O","--optimize"], { |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
128 optimize = true; |
1 | 129 } |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
130 ).help("Optimize code when compiling to LLVM"); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
131 |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
132 argParse.addOption( |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
133 ["--inline"], { |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
134 inline = true; |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
135 } |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
136 ).help("Inline functions when compiling to LLVM"); |
1 | 137 |
138 auto options = argParse.parse(args); | |
139 | |
140 filesToHandle ~= options.args; | |
141 | |
142 try | |
143 { | |
144 preStart(&filesToHandle); | |
145 } | |
146 catch(Exception e) | |
147 { | |
148 return; | |
149 } | |
150 | |
40
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
151 postParse.attach( |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
152 (Decl[] decls, DataSource src) { |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
153 auto llvmGen = new LLVMGen(); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
154 llvmGen.gen(decls, optimize, inline); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
155 }); |
9fb190ad81a4
Added -O and --inline args to Dang.
Anders Johnsen <skabet@gmail.com>
parents:
22
diff
changeset
|
156 |
1 | 157 foreach(file ; filesToHandle) |
158 { | |
159 preLex(file); | |
160 | |
161 auto src = DataSource(file); | |
162 auto lexer = new Lexer(src); | |
22 | 163 /* |
164 auto t = lexer.next; | |
165 while(t.getType != "EOF") | |
166 { | |
167 Stdout(t.getType)(" : ")(t.get).newline; | |
168 t = lexer.next; | |
169 } | |
170 lexer = new Lexer(src); | |
171 */ | |
1 | 172 postLex(lexer); |
173 | |
174 preParse(lexer); | |
175 | |
176 auto parser = new Parser; | |
177 auto decls = parser.parse(lexer); | |
178 | |
13
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
179 (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
|
180 (new Declarations).visit(decls); |
e5caf9971207
Checking for types and identifiers. TODO: Make each varDecl create a new scope
johnsen@johnsen-desktop
parents:
1
diff
changeset
|
181 |
1 | 182 postParse(decls, src); |
183 } | |
184 | |
185 /* if (args.length > 1 && args[1] == "lex") | |
186 { | |
187 Token t; | |
188 | |
189 t = lexer.next(); | |
190 while(t.type != Tok.EOF) | |
191 { | |
192 Stdout(src.get(t.position, t.length)).newline; | |
193 t = lexer.next(); | |
194 } | |
195 } | |
196 else | |
197 { | |
198 auto decl = parser.parse(lexer); | |
199 if(args.length > 1 && args[1] == "dump-ast") | |
200 { | |
201 auto buffer = new AstBuffer(src.data); | |
202 decl.print(buffer); | |
203 } | |
204 }*/ | |
205 } |