From 0c807d765ce5df7aad5e7e758ec18c7ec9f2553c Mon Sep 17 00:00:00 2001 From: nub31 Date: Wed, 29 Jan 2025 16:30:13 +0100 Subject: [PATCH] ... --- Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs | 12 +++--------- .../Frontend/Typing/ExpressionTyper.cs | 18 ++++-------------- Nub.Lang/Nub.Lang/Program.cs | 11 +++++------ 3 files changed, 12 insertions(+), 29 deletions(-) diff --git a/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs b/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs index 2dbab93..8388aeb 100644 --- a/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs +++ b/Nub.Lang/Nub.Lang/Backend/Custom/Generator.cs @@ -52,7 +52,7 @@ public class Generator foreach (var globalVariable in _definitions.OfType()) { var symbol = _symbolTable.ResolveGlobalVariable(globalVariable.Name); - _builder.AppendLine($" {symbol.Identifier}: resq 1 ; {globalVariable.Name}"); + _builder.AppendLine($" {symbol.Identifier}: resq 1"); } _builder.AppendLine(); @@ -61,7 +61,6 @@ public class Generator var main = _symbolTable.ResolveLocalFunc(Entrypoint, []); - _builder.AppendLine(" ; Initialize global variables"); foreach (var globalVariable in _definitions.OfType()) { var symbol = _symbolTable.ResolveGlobalVariable(globalVariable.Name); @@ -70,13 +69,12 @@ public class Generator } _builder.AppendLine(); - _builder.AppendLine($" ; Call entrypoint {Entrypoint}"); _builder.AppendLine($" call {main.StartLabel}"); _builder.AppendLine(); _builder.AppendLine(main.ReturnType.HasValue - ? " mov rdi, rax ; Exit with return value of entrypoint" - : " mov rdi, 0 ; Exit with default status code 0"); + ? " mov rdi, rax" + : " mov rdi, 0"); _builder.AppendLine(" mov rax, 60"); _builder.AppendLine(" syscall"); @@ -121,16 +119,13 @@ public class Generator { var func = _symbolTable.ResolveLocalFunc(node.Name, node.Parameters.Select(p => p.Type).ToList()); - _builder.AppendLine($"; {node.ToString()}"); _builder.AppendLine($"{func.StartLabel}:"); - _builder.AppendLine(" ; Set up stack frame"); _builder.AppendLine(" push rbp"); _builder.AppendLine(" mov rbp, rsp"); _builder.AppendLine($" sub rsp, {func.StackAllocation}"); string[] registers = ["rdi", "rsi", "rdx", "rcx", "r8", "r9"]; - _builder.AppendLine(" ; Body"); for (var i = 0; i < func.Parameters.Count; i++) { var parameter = func.ResolveLocalVariable(func.Parameters.ElementAt(i).Name); @@ -149,7 +144,6 @@ public class Generator GenerateBlock(node.Body, func); _builder.AppendLine($"{func.EndLabel}:"); - _builder.AppendLine(" ; Clean up stack frame"); _builder.AppendLine(" mov rsp, rbp"); _builder.AppendLine(" pop rbp"); _builder.AppendLine(" ret"); diff --git a/Nub.Lang/Nub.Lang/Frontend/Typing/ExpressionTyper.cs b/Nub.Lang/Nub.Lang/Frontend/Typing/ExpressionTyper.cs index acc41ce..a700751 100644 --- a/Nub.Lang/Nub.Lang/Frontend/Typing/ExpressionTyper.cs +++ b/Nub.Lang/Nub.Lang/Frontend/Typing/ExpressionTyper.cs @@ -17,35 +17,25 @@ public class ExpressionTyper private readonly List _variableDefinitions; private readonly Stack _variables; - public ExpressionTyper(FileNode file, Dictionary deps) + public ExpressionTyper(IReadOnlyCollection definitions) { _variables = new Stack(); _functions = []; _variableDefinitions = []; - ResolveFunctions(file, deps); - } - - private void ResolveFunctions(FileNode file, Dictionary deps) - { - var functions = file.Definitions + var functions = definitions .OfType() .Select(f => new Func(f.Name, f.Parameters, f.Body, f.ReturnType)) .ToList(); - var externFunctions = file.Definitions + var externFunctions = definitions .OfType() .Select(f => new Func(f.Name, f.Parameters, Optional.Empty(), f.ReturnType)) .ToList(); _functions.AddRange(functions); _functions.AddRange(externFunctions); - _variableDefinitions.AddRange(file.Definitions.OfType()); - - foreach (var include in file.Includes) - { - ResolveFunctions(deps[include], deps); - } + _variableDefinitions.AddRange(definitions.OfType()); } public void Populate() diff --git a/Nub.Lang/Nub.Lang/Program.cs b/Nub.Lang/Nub.Lang/Program.cs index 5d74ba4..7df74ff 100644 --- a/Nub.Lang/Nub.Lang/Program.cs +++ b/Nub.Lang/Nub.Lang/Program.cs @@ -33,13 +33,12 @@ while (queue.TryDequeue(out var path)) } } -foreach (var file in files) -{ - var typer = new ExpressionTyper(file.Value, files); - typer.Populate(); -} +var definitions = files.Values.SelectMany(f => f.Definitions).ToArray(); -var generator = new Generator(files.Values.SelectMany(f => f.Definitions).ToList()); +var typer = new ExpressionTyper(definitions); +typer.Populate(); + +var generator = new Generator(definitions); var asm = generator.Generate(); Console.WriteLine(asm);