...
This commit is contained in:
2
compiler/.gitignore
vendored
2
compiler/.gitignore
vendored
@@ -1,4 +1,4 @@
|
|||||||
.idea
|
.idea
|
||||||
bin
|
bin
|
||||||
obj
|
obj
|
||||||
out.c
|
.build
|
||||||
@@ -1,47 +1,56 @@
|
|||||||
using Compiler;
|
using System.Diagnostics;
|
||||||
|
using Compiler;
|
||||||
|
|
||||||
const string fileName = "test.nub";
|
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);
|
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;
|
return 0;
|
||||||
Reference in New Issue
Block a user