using NubLang.Ast; using NubLang.Diagnostics; using NubLang.Generation; using NubLang.Syntax; var diagnostics = new List(); var syntaxTrees = new List(); foreach (var file in args) { var tokenizer = new Tokenizer(file, File.ReadAllText(file)); tokenizer.Tokenize(); diagnostics.AddRange(tokenizer.Diagnostics); var parser = new Parser(); var syntaxTree = parser.Parse(tokenizer.Tokens); diagnostics.AddRange(parser.Diagnostics); syntaxTrees.Add(syntaxTree); } var modules = Module.Collect(syntaxTrees); var compilationUnits = new List>(); for (var i = 0; i < args.Length; i++) { var typeChecker = new TypeChecker(syntaxTrees[i], modules); var compilationUnit = typeChecker.Check(); compilationUnits.Add(compilationUnit); diagnostics.AddRange(typeChecker.Diagnostics); } foreach (var diagnostic in diagnostics) { Console.Error.WriteLine(diagnostic.FormatANSI()); } if (diagnostics.Any(diagnostic => diagnostic.Severity == DiagnosticSeverity.Error)) { return 1; } Directory.CreateDirectory(".build"); for (var i = 0; i < args.Length; i++) { var file = args[i]; var compilationUnit = compilationUnits[i]; var generator = new LlvmGenerator(); var directory = Path.GetDirectoryName(file); if (!string.IsNullOrWhiteSpace(directory)) { Directory.CreateDirectory(Path.Combine(".build", directory)); } var path = Path.Combine(".build", Path.ChangeExtension(file, "ll")); File.WriteAllText(path, generator.Emit(compilationUnit)); } return 0;