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); } } }
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(); }