示例#1
0
        public static void Build(BuildConfig config)
        {
            bool printAST = config.IsSet("printAST");
            var asts = new List<AST.File>();
            var errors = new List<string>();

            foreach (string file in config.Files)
            {
                var p = new Parser(file, config);
                var ast = p.Parse();
                if (!ast.Error) { asts.Add(ast.Result as AST.File); }
                if (p.Errors.Count == 0)
                {
                    if (printAST)
                    {
                        Console.WriteLine(Environment.NewLine + Environment.NewLine + "AST");
                        ast.Result.Print(1);
                    }
                }
                else { foreach (var e in p.Errors) { errors.Add(e); } }
            }

            if (config.IsSet("build") && errors.Count == 0)
            {
                var ws = new WalkState(config["asm"], config["out"]);
                errors = ws.Errors;

                if (errors.Count == 0) { foreach (var a in asts) { a.GenTypes(ws); } }
                if (errors.Count == 0) { foreach (var a in asts) { a.GenClassItems(ws); } }
                if (errors.Count == 0) { ws.Assembly.GenFunctions(ws); }
                if (errors.Count == 0) { ws.Assembly.CreateTypes(); }
                if (errors.Count == 0) { ws.Save(); }
            }

            if (errors.Count > 0)
            {
                Console.WriteLine(Environment.NewLine + Environment.NewLine + "Errors:");
                foreach (var e in errors) { Console.WriteLine(e); }
            }
        }
示例#2
0
        public static void Main(string[] args)
        {
            Console.WriteLine("Minet Compiler 0.1");
            if (args.Length > 0)
            {
                var state = CommandLineState.Files;
                var config = new BuildConfig();
                foreach (string a in args)
                {
                    switch (a)
                    {
                        case "/files":
                            state = CommandLineState.Files;
                            break;
                        default:
                            if (a[0] == '/')
                            {
                                string[] parts = a.Substring(1).Split(new[] { ':' });
                                string val = null;
                                if (parts.Length > 1) { val = parts[1]; }
                                config.Flags[parts[0]] = val;
                            }
                            else
                            {
                                switch (state)
                                {
                                    case CommandLineState.Files:
                                        config.Files.Add(a);
                                        break;
                                    default:
                                        Console.WriteLine("Unknown state: " + state);
                                        break;
                                }
                            }
                            break;
                    }
                }

                var errors = new List<string>();
                if (config.Files.Count == 0)
                {
                    errors.Add("You must specify at least one file to build.");
                }
                if (config.IsSet("build"))
                {
                    if (!config.IsSet("asm"))
                    {
                        errors.Add("You must specify an assembly name with /asm:assembly_name when building.");
                    }
                    if (!config.IsSet("out"))
                    {
                        errors.Add("You must specify an output file name with /out:filename when building.");
                    }
                }

                if (errors.Count == 0)
                {
                    Compiler.Compiler.Build(config);
                    Console.WriteLine(Environment.NewLine + "Done");
                }
                else
                {
                    Console.WriteLine("Errors:");
                    foreach(var e in errors) { Console.WriteLine(e); }
                }

            }
            else { Console.WriteLine("Usage: minet <path> [parameters]"); }
            Console.ReadKey();
        }