annotate dang/compiler.d @ 1:2168f4cb73f1

First push
author johnsen@johnsen-desktop
date Fri, 18 Apr 2008 02:01:38 +0200
parents
children e5caf9971207
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 dang.compiler;
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 tango.core.Signal,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
5 tango.io.FilePath;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
6
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
7 import lexer.Lexer,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
8 parser.Parser;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
9
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
10 import misc.DataSource;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
11
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
12 import ast.Decl;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
13
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14 import tools.AstPrinter,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
15 tools.DotPrinter;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
16
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
17 import gen.LuaGen,
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
18 gen.LLVMGen;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
19
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
20 import sema.Visitor;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
21
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
22 import dang.OptParse;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
23
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
24 void checkFiles(char[][] *files)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
25 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
26 bool error = false;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
27
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
28 char[][] validFiles;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
29
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
30 foreach(file ; *files)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
31 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
32 auto path = new FilePath(file);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
33
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
34 if(!path.exists)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
35 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
36 Stdout("File '"~file~"' does not exists").newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
37 error = true;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
38
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
39 continue;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
40 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
41
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
42 bool fileInStack = false;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
43 foreach(vFile ; validFiles)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
44 if(vFile == file)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
45 fileInStack = true;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
46
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
47 if(fileInStack)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
48 continue;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
49
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
50 validFiles ~= file;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
51 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
52
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
53 *files = validFiles;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
54
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
55 if(error)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
56 throw new Exception("Some file(s) did not exist");
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
57 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
58 void main(char[][] args)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
59 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
60 char[][] filesToHandle;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
61
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
62 Signal!(char[][]*) preStart;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
63
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
64 Signal!(char[]) preLex;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
65 Signal!(Lexer) postLex;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
66
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
67 Signal!(Lexer) preParse;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
68 Signal!(Decl[], DataSource) postParse;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
69
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
70 preStart.attach(&checkFiles);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
71
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
72 auto argParse = new OptionParser;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
73
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
74 argParse.addOption(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
75 ["-h", "--help"],{
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
76 argParse.helpText();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
77 return;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
78 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
79 ).help("Show this help message");
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
80
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
81 argParse.addOption(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
82 ["--ast-dump-dot"], {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
83 postParse.attach(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
84 (Decl[] decls, DataSource src) {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
85 auto print = new DotPrinter();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
86 print.print(decls);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
87 });
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
88 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
89 ).help("Output the AST as dot-graphicz");
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
90
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
91 argParse.addOption(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
92 ["--ast-dump-code"], {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
93 postParse.attach(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
94 (Decl[] decls, DataSource src) {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
95 auto print = new AstPrinter(src);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
96 print.print(decls);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
97 });
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
98 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
99 ).help("Output the AST as dot-graphicz");
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
100
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
101 argParse.addOption(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
102 ["--gen-lua"], {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
103 postParse.attach(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
104 (Decl[] decls, DataSource src) {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
105 auto luaGen = new LuaGen();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
106 luaGen.gen(decls);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
107 });
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
108 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
109 ).help("Compile to Lua code");
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
110
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
111 argParse.addOption(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
112 ["--gen-llvm"], {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
113 postParse.attach(
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
114 (Decl[] decls, DataSource src) {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
115 auto llvmGen = new LLVMGen();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
116 llvmGen.gen(decls);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
117 });
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
118 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
119 ).help("Compile to LLVM code");
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
120
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
121 auto options = argParse.parse(args);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
122
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
123 filesToHandle ~= options.args;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
124
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
125 try
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
126 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
127 preStart(&filesToHandle);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
128 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
129 catch(Exception e)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
130 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
131 return;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
132 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
133
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
134 foreach(file ; filesToHandle)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
135 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
136 preLex(file);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
137
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
138 auto src = DataSource(file);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
139 auto lexer = new Lexer(src);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
140
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
141 postLex(lexer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
142
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
143 preParse(lexer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
144
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
145 auto parser = new Parser;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
146 auto decls = parser.parse(lexer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
147
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
148 postParse(decls, src);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
149 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
150
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
151 /* if (args.length > 1 && args[1] == "lex")
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
152 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
153 Token t;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
154
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
155 t = lexer.next();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
156 while(t.type != Tok.EOF)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
157 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
158 Stdout(src.get(t.position, t.length)).newline;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
159 t = lexer.next();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
160 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
161 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
162 else
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
163 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
164 auto decl = parser.parse(lexer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
165 if(args.length > 1 && args[1] == "dump-ast")
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
166 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
167 auto buffer = new AstBuffer(src.data);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
168 decl.print(buffer);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
169 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
170 }*/
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
171 }