Mercurial > projects > dang
diff dang/compiler.d @ 1:2168f4cb73f1
First push
author | johnsen@johnsen-desktop |
---|---|
date | Fri, 18 Apr 2008 02:01:38 +0200 |
parents | |
children | e5caf9971207 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dang/compiler.d Fri Apr 18 02:01:38 2008 +0200 @@ -0,0 +1,171 @@ +module dang.compiler; + +import tango.io.Stdout, + tango.core.Signal, + tango.io.FilePath; + +import lexer.Lexer, + parser.Parser; + +import misc.DataSource; + +import ast.Decl; + +import tools.AstPrinter, + tools.DotPrinter; + +import gen.LuaGen, + gen.LLVMGen; + +import sema.Visitor; + +import dang.OptParse; + +void checkFiles(char[][] *files) +{ + bool error = false; + + char[][] validFiles; + + foreach(file ; *files) + { + auto path = new FilePath(file); + + if(!path.exists) + { + Stdout("File '"~file~"' does not exists").newline; + error = true; + + continue; + } + + bool fileInStack = false; + foreach(vFile ; validFiles) + if(vFile == file) + fileInStack = true; + + if(fileInStack) + continue; + + validFiles ~= file; + } + + *files = validFiles; + + if(error) + throw new Exception("Some file(s) did not exist"); +} +void main(char[][] args) +{ + char[][] filesToHandle; + + Signal!(char[][]*) preStart; + + Signal!(char[]) preLex; + Signal!(Lexer) postLex; + + Signal!(Lexer) preParse; + Signal!(Decl[], DataSource) postParse; + + preStart.attach(&checkFiles); + + auto argParse = new OptionParser; + + argParse.addOption( + ["-h", "--help"],{ + argParse.helpText(); + return; + } + ).help("Show this help message"); + + argParse.addOption( + ["--ast-dump-dot"], { + postParse.attach( + (Decl[] decls, DataSource src) { + auto print = new DotPrinter(); + print.print(decls); + }); + } + ).help("Output the AST as dot-graphicz"); + + argParse.addOption( + ["--ast-dump-code"], { + postParse.attach( + (Decl[] decls, DataSource src) { + auto print = new AstPrinter(src); + print.print(decls); + }); + } + ).help("Output the AST as dot-graphicz"); + + argParse.addOption( + ["--gen-lua"], { + postParse.attach( + (Decl[] decls, DataSource src) { + auto luaGen = new LuaGen(); + luaGen.gen(decls); + }); + } + ).help("Compile to Lua code"); + + argParse.addOption( + ["--gen-llvm"], { + postParse.attach( + (Decl[] decls, DataSource src) { + auto llvmGen = new LLVMGen(); + llvmGen.gen(decls); + }); + } + ).help("Compile to LLVM code"); + + auto options = argParse.parse(args); + + filesToHandle ~= options.args; + + try + { + preStart(&filesToHandle); + } + catch(Exception e) + { + return; + } + + foreach(file ; filesToHandle) + { + preLex(file); + + auto src = DataSource(file); + auto lexer = new Lexer(src); + + postLex(lexer); + + preParse(lexer); + + auto parser = new Parser; + auto decls = parser.parse(lexer); + + postParse(decls, src); + } + +/* if (args.length > 1 && args[1] == "lex") + { + Token t; + + t = lexer.next(); + while(t.type != Tok.EOF) + { + Stdout(src.get(t.position, t.length)).newline; + t = lexer.next(); + } + } + else + { + auto decl = parser.parse(lexer); + if(args.length > 1 && args[1] == "dump-ast") + { + auto buffer = new AstBuffer(src.data); + decl.print(buffer); + } + }*/ +}