From f035499ba703924dcec73f5c726f19d54df4695d Mon Sep 17 00:00:00 2001 From: nub31 Date: Mon, 9 Feb 2026 15:20:29 +0100 Subject: [PATCH] ... --- compiler/.gitignore | 2 +- compiler/Program.cs | 91 +++++++++++++++++++++++++-------------------- 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/compiler/.gitignore b/compiler/.gitignore index 57615c6..0418d79 100644 --- a/compiler/.gitignore +++ b/compiler/.gitignore @@ -1,4 +1,4 @@ .idea bin obj -out.c \ No newline at end of file +.build \ No newline at end of file diff --git a/compiler/Program.cs b/compiler/Program.cs index d0d70d6..0b86813 100644 --- a/compiler/Program.cs +++ b/compiler/Program.cs @@ -1,47 +1,56 @@ -using Compiler; +using System.Diagnostics; +using Compiler; -const string fileName = "test.nub"; - -var file = File.ReadAllText(fileName); - -var tokens = Tokenizer.Tokenize(fileName, file, out var tokenizerDiagnostics); - -foreach (var diagnostic in tokenizerDiagnostics) +foreach (var fileName in args) { - DiagnosticFormatter.Print(diagnostic, Console.Error); + 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 typedAst = TypeChecker.Check(fileName, ast, out var typeCheckerDiagnostics); + + foreach (var diagnostic in typeCheckerDiagnostics) + { + DiagnosticFormatter.Print(diagnostic, Console.Error); + } + + if (typeCheckerDiagnostics.Any(x => x.Severity == DiagnosticSeverity.Error)) + { + return 1; + } + + var output = Generator.Emit(typedAst); + + 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]); } -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 typedAst = TypeChecker.Check(fileName, ast, out var typeCheckerDiagnostics); - -foreach (var diagnostic in typeCheckerDiagnostics) -{ - DiagnosticFormatter.Print(diagnostic, Console.Error); -} - -if (typeCheckerDiagnostics.Any(x => x.Severity == DiagnosticSeverity.Error)) -{ - return 1; -} - -var output = Generator.Emit(typedAst); - -File.WriteAllText("out.c", output); return 0; \ No newline at end of file