using System.Diagnostics; using Compiler; foreach (var fileName in args) { var file = File.ReadAllText(fileName); var tokens = Tokenizer.Tokenize(fileName, file, out var tokenizerDiagnostics); foreach (var diagnostic in tokenizerDiagnostics) DiagnosticFormatter.Print(diagnostic, Console.Error); if (tokenizerDiagnostics.Any(x => x.Severity == DiagnosticSeverity.Error)) return 1; var ast = Parser.Parse(fileName, tokens, out var parserDiagnostics); foreach (var diagnostic in parserDiagnostics) DiagnosticFormatter.Print(diagnostic, Console.Error); if (parserDiagnostics.Any(x => x.Severity == DiagnosticSeverity.Error)) return 1; var typeResolver = TypeResolver.Create(fileName, ast, out var typeResolverDiagnostics); foreach (var diagnostic in typeResolverDiagnostics) DiagnosticFormatter.Print(diagnostic, Console.Error); if (typeResolverDiagnostics.Any(x => x.Severity == DiagnosticSeverity.Error)) return 1; var functions = new List(); foreach (var function in ast.Definitions.OfType()) { var typedFunction = TypeChecker.CheckFunction(fileName, function, typeResolver, out var typeCheckerDiagnostics); foreach (var diagnostic in typeCheckerDiagnostics) DiagnosticFormatter.Print(diagnostic, Console.Error); if (typedFunction == null) return 1; functions.Add(typedFunction); } var output = Generator.Emit(functions); Directory.Delete(".build", recursive: true); Directory.CreateDirectory(".build"); var outFilePath = Path.Combine(".build", Path.ChangeExtension(fileName, "c")); File.WriteAllText(outFilePath, output); Process.Start("gcc", ["-Og", "-g", "-c", "-o", Path.ChangeExtension(outFilePath, "o"), outFilePath]); } return 0;