52 lines
1.7 KiB
C#
52 lines
1.7 KiB
C#
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 typedAst = TypeChecker.Check(fileName, ast, typeResolver, 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]);
|
|
}
|
|
|
|
|
|
return 0; |