diff dang/compiler.d @ 211:9e9f3e7e342b default tip

Added dang folder and Module in ast.
author Anders Johnsen <skabet@gmail.com>
date Tue, 12 Aug 2008 20:07:35 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dang/compiler.d	Tue Aug 12 20:07:35 2008 +0200
@@ -0,0 +1,240 @@
+module dang.compiler;
+
+import tango.io.Stdout,
+       tango.core.Signal,
+       tango.core.Memory,
+       tango.sys.Process,
+       tango.time.StopWatch,
+       tango.text.Util,
+       tango.io.FileConduit,
+       tango.io.FilePath;
+
+import lexer.Lexer,
+       parser.Action,
+       parser.Parser;
+
+import basic.SourceManager;
+
+import basic.Message;
+
+import ast.Module;
+
+import tango.stdc.posix.unistd;
+import tango.stdc.stdlib;
+
+import Opt = dang.OptParse;
+            
+class NullAction : Action 
+{
+}
+
+void checkFiles(char[][] *files)
+{
+//    GC.disable();
+    bool non_existant_files = false;
+    bool duplicate_files = false;
+
+    char[][] validFiles;
+
+    foreach (file; *files)
+    {
+        scope path = new FilePath(file);
+
+        if (!path.exists)
+        {
+            Stderr.formatln("'{}' does not exist", file).newline;
+            non_existant_files = true;
+
+            continue;
+        }
+        
+        bool fileInStack = false;
+        foreach (vFile; validFiles)
+            if (vFile == file)
+            {
+                fileInStack = true;
+                duplicate_files = true;
+            }
+
+        if (fileInStack)
+            continue;
+
+        validFiles ~= path.toString();
+    }
+
+    *files = validFiles;
+
+    if (non_existant_files)
+        throw new Exception("All files given must exist");
+    if (duplicate_files)
+        Stderr("warning: duplicate files ignored").newline;
+}
+
+void main(char[][] args)
+{
+    char[][] filesToHandle;
+
+    Signal!(char[][]*) preStart;
+
+    Signal!(char[]) preLex;
+    Signal!(Lexer) postLex;
+
+    Signal!(Lexer) preParse;
+    Signal!(Module[], SourceManager) postParse;
+    Signal!(Module[], SourceManager) postSema;
+
+    preStart.attach(&checkFiles);
+
+    auto argParse = new Opt.OptionParser(`Dang "D" compiler v0.1`);
+
+    bool optimize = false;
+    bool inline = false;
+
+
+    SourceManager src_mgr = new SourceManager;
+    MessageHandler messages = new MessageHandler(src_mgr);
+
+    argParse.addOption(["-h", "--help"], Opt.Action.Help)
+        .help("Show this help message");
+
+    auto options = argParse.parse(args);
+
+    filesToHandle ~= options.args;
+    
+    // Will throw exception if some files don't exist
+    preStart(&filesToHandle);
+
+    struct Measurement { char[] label; double time; }
+    Measurement[] timings;
+    StopWatch total;
+    total.start;
+
+    Module[] modules;
+
+    StopWatch watch;
+    watch.start;
+    foreach (file; filesToHandle)
+    {
+        preLex(file);
+
+        auto start = src_mgr.addFile(file);
+        auto lexer = new Lexer(start, src_mgr, messages);
+        postLex(lexer);
+
+        preParse(lexer);
+
+        auto parser = new Parser(messages);
+        auto action = new NullAction;
+        modules ~= cast(Module)parser.parse(src_mgr, lexer, action);
+        timings ~= Measurement("Lex + Parse of '"~file~"'", watch.stop);
+        messages.checkErrors(ExitLevel.Parser);
+/*
+        StopWatch watch2;
+        watch.start;
+        watch2.start;
+        Module[] mods = (new LoadModule).visit(m, src_mgr, messages);
+        (new ScopeBuilder).visit(m);
+        auto scope_builder = watch2.stop;
+        watch2.start;
+        (new ScopeCheck).visit(m);
+        auto scope_check = watch2.stop;
+        watch2.start;
+        (new TypeCheck).visit(m);
+        auto type_check = watch2.stop;
+        watch2.start;
+
+        foreach (decl; m.decls)
+            decl.simplify();
+        auto simplify = watch2.stop;
+        auto extra_stuff = watch.stop;
+        timings ~= Measurement("Extra stuff", watch.stop);
+        timings ~= Measurement("  - Building scopes", scope_builder);
+        timings ~= Measurement("  - Checking scopes", scope_check);
+        timings ~= Measurement("  - Checking types", type_check);
+
+        postParse(m, src_mgr);*/
+    }
+/*
+    (new LiteralInterpreter(messages)).visit(modules);
+    messages.checkErrors;
+    postParse(modules, src_mgr);
+
+    class ModuleLoader : Visitor!(void)
+    {
+        Module[] visit(Module[] modules, MessageHandler messages, SourceManager src_mgr)
+        {
+            this.modules = modules;
+            this.messages = messages;
+            this.src_mgr = src_mgr;
+            super.visit(modules);
+            return this.modules;
+        }
+
+        override void visitImportDecl(ImportDecl decl)
+        {
+            char[] path = replace!(char)(decl.get,'.','/')~".d";
+
+            auto start = src_mgr.addFile(path);
+            auto lexer = new Lexer(start, src_mgr, messages);
+
+            auto parser = new Parser(messages);
+            auto action = new AstAction(src_mgr);
+
+            Module m = cast(Module)parser.parse(src_mgr, lexer, action);
+            modules ~= m;
+            m.outputModule = false;
+    //        decl.env.mHandle.add(m);
+            messages.checkErrors(ExitLevel.Parser);
+        }
+
+        Module[] modules;
+        SourceManager src_mgr;
+        MessageHandler messages;
+    }
+
+    modules = (new ModuleLoader()).visit(modules, messages, src_mgr);
+    messages.checkErrors;
+
+    (new BuildScopes).visit(modules);
+    (new BuildSymbols).visit(modules);
+    StopWatch watch2;
+    watch.start;
+    watch2.start;
+
+    (new BuildTypes(messages)).visit(modules);
+
+    (new CheckScopes(messages)).visit(modules);
+    messages.checkErrors;
+    auto scope_check = watch2.stop;
+
+    watch2.start;
+    (new CheckTypes(messages)).visit(modules);
+    messages.checkErrors;
+    auto type_check = watch2.stop;
+
+    watch2.start;
+    (new ObjectOriented(messages)).visit(modules);
+    messages.checkErrors;
+    auto object_check = watch2.stop;
+
+    watch2.start;
+    auto vc = new VC;
+    vc.msg = messages;
+    foreach (m; modules)
+        m.verify(vc);
+    messages.checkErrors;
+    auto ast_verify = watch2.stop;
+
+    foreach (m; modules)
+        foreach (decl; m.decls)
+            decl.simplify();
+
+    timings ~= Measurement("Total", total.stop);
+    postSema(modules, src_mgr);
+
+    if (options.flag("time"))
+        foreach (m; timings)
+            Stderr.formatln("{,-45} {}ms", m.label, m.time*1e3);
+    */
+}
+