From 5c7e12feebac02f4536848d80c819389e84bd3b3 Mon Sep 17 00:00:00 2001 From: nub31 Date: Sat, 5 Jul 2025 15:47:36 +0200 Subject: [PATCH] ... --- src/compiler/CLI/Program.cs | 1 + src/compiler/Generation/QBE/QBEGenerator.cs | 5 +- src/compiler/Syntax/Binding/Binder.cs | 48 ++++--------------- .../Syntax/Binding/BoundSyntaxTree.cs | 5 -- src/compiler/Syntax/Node/Definition.cs | 11 ++--- src/compiler/Syntax/Node/Expression.cs | 2 +- src/compiler/Syntax/Node/Node.cs | 3 +- src/compiler/Syntax/Node/Statement.cs | 4 +- src/compiler/Syntax/Node/SyntaxTree.cs | 4 ++ src/compiler/Syntax/Parsing/SyntaxTree.cs | 5 -- 10 files changed, 27 insertions(+), 61 deletions(-) delete mode 100644 src/compiler/Syntax/Binding/BoundSyntaxTree.cs create mode 100644 src/compiler/Syntax/Node/SyntaxTree.cs delete mode 100644 src/compiler/Syntax/Parsing/SyntaxTree.cs diff --git a/src/compiler/CLI/Program.cs b/src/compiler/CLI/Program.cs index 290edad..262a52b 100644 --- a/src/compiler/CLI/Program.cs +++ b/src/compiler/CLI/Program.cs @@ -4,6 +4,7 @@ using Generation.QBE; using Syntax; using Syntax.Binding; using Syntax.Diagnostics; +using Syntax.Node; using Syntax.Parsing; using Syntax.Tokenization; using Binder = Syntax.Binding.Binder; diff --git a/src/compiler/Generation/QBE/QBEGenerator.cs b/src/compiler/Generation/QBE/QBEGenerator.cs index 51bd144..b6f7363 100644 --- a/src/compiler/Generation/QBE/QBEGenerator.cs +++ b/src/compiler/Generation/QBE/QBEGenerator.cs @@ -3,7 +3,6 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text; using Syntax; -using Syntax.Binding; using Syntax.Node; using Syntax.Tokenization; @@ -543,7 +542,7 @@ public static class QBEGenerator }; } - private static void EmitFuncDefinition(BoundNode debugNode, string name, List parameters, NubType returnType, BoundBlockNode body, bool exported) + private static void EmitFuncDefinition(BoundNode debugNode, string name, List parameters, NubType returnType, BoundBlock body, bool exported) { _variables.Clear(); _variableScopes.Clear(); @@ -689,7 +688,7 @@ public static class QBEGenerator EmitCopyIntoOrInitialize(assignment.Value, destination.Name); } - private static void EmitBlock(BoundBlockNode block, List? variables = null) + private static void EmitBlock(BoundBlock block, List? variables = null) { _variableScopes.Push(_variables.Count); if (variables != null) diff --git a/src/compiler/Syntax/Binding/Binder.cs b/src/compiler/Syntax/Binding/Binder.cs index 1c20db2..4d83b2e 100644 --- a/src/compiler/Syntax/Binding/Binder.cs +++ b/src/compiler/Syntax/Binding/Binder.cs @@ -1,7 +1,6 @@ using Common; using Syntax.Diagnostics; using Syntax.Node; -using Syntax.Parsing; using Syntax.Tokenization; using UnaryExpressionNode = Syntax.Node.UnaryExpressionNode; @@ -55,14 +54,12 @@ public static class Binder foreach (var function in node.Functions) { - var parameters = new List(); foreach (var parameter in function.Parameters) { - parameters.Add(new BoundFuncParameter(parameter.Name, parameter.Type)); _variables[parameter.Name] = parameter.Type; } - functions.Add(new BoundImplementationFuncNode(function.Tokens, function.Name, parameters, function.ReturnType, BindBlock(function.Body))); + functions.Add(new BoundImplementationFuncNode(function.Tokens, function.Name, function.Parameters, function.ReturnType, BindBlock(function.Body))); } return new BoundTraitImplementationDefinitionNode(node.Tokens, node.Namespace, node.TraitType, node.ForType, functions); @@ -74,14 +71,7 @@ public static class Binder foreach (var func in node.Functions) { - var parameters = new List(); - - foreach (var parameter in func.Parameters) - { - parameters.Add(new BoundFuncParameter(parameter.Name, parameter.Type)); - } - - functions.Add(new BountTraitFunc(func.Name, parameters, func.ReturnType)); + functions.Add(new BountTraitFunc(func.Name, func.Parameters, func.ReturnType)); } return new BoundTraitDefinitionNode(node.Tokens, node.Namespace, node.Name, functions); @@ -120,14 +110,7 @@ public static class Binder private static BoundExternFuncDefinitionNode BindExternFuncDefinition(ExternFuncDefinitionNode node) { - var parameters = new List(); - - foreach (var parameter in node.Parameters) - { - parameters.Add(new BoundFuncParameter(parameter.Name, parameter.Type)); - } - - return new BoundExternFuncDefinitionNode(node.Tokens, node.Namespace, node.Name, node.CallName, parameters, node.ReturnType); + return new BoundExternFuncDefinitionNode(node.Tokens, node.Namespace, node.Name, node.CallName, node.Parameters, node.ReturnType); } private static BoundLocalFuncDefinitionNode BindLocalFuncDefinition(LocalFuncDefinitionNode node) @@ -135,20 +118,17 @@ public static class Binder _variables.Clear(); _funcReturnType = node.ReturnType; - var parameters = new List(); - foreach (var parameter in node.Parameters) { - parameters.Add(new BoundFuncParameter(parameter.Name, parameter.Type)); _variables[parameter.Name] = parameter.Type; } var body = BindBlock(node.Body); - return new BoundLocalFuncDefinitionNode(node.Tokens, node.Namespace, node.Name, parameters, body, node.ReturnType, node.Exported); + return new BoundLocalFuncDefinitionNode(node.Tokens, node.Namespace, node.Name, node.Parameters, body, node.ReturnType, node.Exported); } - private static BoundBlockNode BindBlock(BlockNode node) + private static BoundBlock BindBlock(BlockNode node) { var statements = new List(); @@ -157,7 +137,7 @@ public static class Binder statements.Add(BindStatement(statement)); } - return new BoundBlockNode(node.Tokens, statements); + return new BoundBlock(node.Tokens, statements); } private static BoundStatementNode BindStatement(StatementNode node) @@ -195,11 +175,11 @@ public static class Binder private static BoundIfNode BindIf(IfNode statement) { - var elseStatement = Optional.Empty>(); + var elseStatement = Optional.Empty>(); if (statement.Else.HasValue) { - elseStatement = statement.Else.Value.Match> + elseStatement = statement.Else.Value.Match> ( elseIf => BindIf(elseIf), @else => BindBlock(@else) @@ -286,19 +266,11 @@ public static class Binder private static BoundAnonymousFuncNode BindAnonymousFunc(AnonymousFuncNode expression) { - var parameters = new List(); - var parameterTypes = new List(); - - foreach (var parameter in expression.Parameters) - { - var boundParameter = new BoundFuncParameter(parameter.Name, parameter.Type); - parameters.Add(boundParameter); - parameterTypes.Add(boundParameter.Type); - } + var parameterTypes = expression.Parameters.Select(x => x.Type).ToList(); var body = BindBlock(expression.Body); - return new BoundAnonymousFuncNode(expression.Tokens, new NubFuncType(expression.ReturnType, parameterTypes), parameters, body, expression.ReturnType); + return new BoundAnonymousFuncNode(expression.Tokens, new NubFuncType(expression.ReturnType, parameterTypes), expression.Parameters, body, expression.ReturnType); } private static BoundArrayIndexAccessNode BindArrayIndexAccess(ArrayIndexAccessNode expression) diff --git a/src/compiler/Syntax/Binding/BoundSyntaxTree.cs b/src/compiler/Syntax/Binding/BoundSyntaxTree.cs deleted file mode 100644 index 37b9c39..0000000 --- a/src/compiler/Syntax/Binding/BoundSyntaxTree.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Syntax.Node; - -namespace Syntax.Binding; - -public record BoundSyntaxTree(string Namespace, List Definitions); diff --git a/src/compiler/Syntax/Node/Definition.cs b/src/compiler/Syntax/Node/Definition.cs index e70ed0e..bb82f5d 100644 --- a/src/compiler/Syntax/Node/Definition.cs +++ b/src/compiler/Syntax/Node/Definition.cs @@ -7,16 +7,15 @@ public abstract record DefinitionNode(IEnumerable Tokens, string Namespac public abstract record BoundDefinitionNode(IEnumerable Tokens, string Namespace) : BoundNode(Tokens); public record FuncParameter(string Name, NubType Type); -public record BoundFuncParameter(string Name, NubType Type); public abstract record FuncDefinition(IEnumerable Tokens, string Namespace, string Name, List Parameters, NubType ReturnType) : DefinitionNode(Tokens, Namespace); -public abstract record BoundFuncDefinition(IEnumerable Tokens, string Namespace, string Name, List Parameters, NubType ReturnType) : BoundDefinitionNode(Tokens, Namespace); +public abstract record BoundFuncDefinition(IEnumerable Tokens, string Namespace, string Name, List Parameters, NubType ReturnType) : BoundDefinitionNode(Tokens, Namespace); public record LocalFuncDefinitionNode(IEnumerable Tokens, string Namespace, string Name, List Parameters, BlockNode Body, NubType ReturnType, bool Exported) : FuncDefinition(Tokens, Namespace, Name, Parameters, ReturnType); -public record BoundLocalFuncDefinitionNode(IEnumerable Tokens, string Namespace, string Name, List Parameters, BoundBlockNode Body, NubType ReturnType, bool Exported) : BoundFuncDefinition(Tokens, Namespace, Name, Parameters, ReturnType); +public record BoundLocalFuncDefinitionNode(IEnumerable Tokens, string Namespace, string Name, List Parameters, BoundBlock Body, NubType ReturnType, bool Exported) : BoundFuncDefinition(Tokens, Namespace, Name, Parameters, ReturnType); public record ExternFuncDefinitionNode(IEnumerable Tokens, string Namespace, string Name, string CallName, List Parameters, NubType ReturnType) : FuncDefinition(Tokens, Namespace, Name, Parameters, ReturnType); -public record BoundExternFuncDefinitionNode(IEnumerable Tokens, string Namespace, string Name, string CallName, List Parameters, NubType ReturnType) : BoundFuncDefinition(Tokens, Namespace, Name, Parameters, ReturnType); +public record BoundExternFuncDefinitionNode(IEnumerable Tokens, string Namespace, string Name, string CallName, List Parameters, NubType ReturnType) : BoundFuncDefinition(Tokens, Namespace, Name, Parameters, ReturnType); public record StructField(string Name, NubType Type, Optional Value); public record BoundStructField(string Name, NubType Type, Optional Value); @@ -25,13 +24,13 @@ public record StructDefinitionNode(IEnumerable Tokens, string Namespace, public record BoundStructDefinitionNode(IEnumerable Tokens, string Namespace, string Name, List Fields) : BoundDefinitionNode(Tokens, Namespace); public record TraitFunc(string Name, List Parameters, NubType ReturnType); -public record BountTraitFunc(string Name, List Parameters, NubType ReturnType); +public record BountTraitFunc(string Name, List Parameters, NubType ReturnType); public record TraitDefinitionNode(IEnumerable Tokens, string Namespace, string Name, List Functions) : DefinitionNode(Tokens, Namespace); public record BoundTraitDefinitionNode(IEnumerable Tokens, string Namespace, string Name, List Functions) : BoundDefinitionNode(Tokens, Namespace); public record ImplementationFuncNode(IEnumerable Tokens, string Name, List Parameters, NubType ReturnType, BlockNode Body) : BoundNode(Tokens); -public record BoundImplementationFuncNode(IEnumerable Tokens, string Name, List Parameters, NubType ReturnType, BoundBlockNode Body) : BoundNode(Tokens); +public record BoundImplementationFuncNode(IEnumerable Tokens, string Name, List Parameters, NubType ReturnType, BoundBlock Body) : BoundNode(Tokens); public record BoundTraitImplementationDefinitionNode(IEnumerable Tokens, string Namespace, NubType TraitType, NubType ForType, List Functions) : BoundDefinitionNode(Tokens, Namespace); public record TraitImplementationDefinitionNode(IEnumerable Tokens, string Namespace, NubType TraitType, NubType ForType, List Functions) : DefinitionNode(Tokens, Namespace); \ No newline at end of file diff --git a/src/compiler/Syntax/Node/Expression.cs b/src/compiler/Syntax/Node/Expression.cs index 0e71aa4..c7d3c9e 100644 --- a/src/compiler/Syntax/Node/Expression.cs +++ b/src/compiler/Syntax/Node/Expression.cs @@ -45,7 +45,7 @@ public record ArrayIndexAccessNode(IEnumerable Tokens, ExpressionNode Arr public record BoundArrayIndexAccessNode(IEnumerable Tokens, NubType Type, BoundExpressionNode Array, BoundExpressionNode Index) : BoundExpressionNode(Tokens, Type); public record AnonymousFuncNode(IEnumerable Tokens, List Parameters, BlockNode Body, NubType ReturnType) : ExpressionNode(Tokens); -public record BoundAnonymousFuncNode(IEnumerable Tokens, NubType Type, List Parameters, BoundBlockNode Body, NubType ReturnType) : BoundExpressionNode(Tokens, Type); +public record BoundAnonymousFuncNode(IEnumerable Tokens, NubType Type, List Parameters, BoundBlock Body, NubType ReturnType) : BoundExpressionNode(Tokens, Type); public record AddressOfNode(IEnumerable Tokens, ExpressionNode Expression) : ExpressionNode(Tokens); public record BoundAddressOfNode(IEnumerable Tokens, NubType Type, BoundExpressionNode Expression) : BoundExpressionNode(Tokens, Type); diff --git a/src/compiler/Syntax/Node/Node.cs b/src/compiler/Syntax/Node/Node.cs index b9ce43e..14b11fd 100644 --- a/src/compiler/Syntax/Node/Node.cs +++ b/src/compiler/Syntax/Node/Node.cs @@ -6,4 +6,5 @@ public abstract record Node(IEnumerable Tokens); public abstract record BoundNode(IEnumerable Tokens); public record BlockNode(IEnumerable Tokens, List Statements) : Node(Tokens); -public record BoundBlockNode(IEnumerable Tokens, List Statements) : BoundNode(Tokens); \ No newline at end of file + +public record BoundBlock(IEnumerable Tokens, List Statements); \ No newline at end of file diff --git a/src/compiler/Syntax/Node/Statement.cs b/src/compiler/Syntax/Node/Statement.cs index 65981b2..c967fdc 100644 --- a/src/compiler/Syntax/Node/Statement.cs +++ b/src/compiler/Syntax/Node/Statement.cs @@ -17,7 +17,7 @@ public record AssignmentNode(IEnumerable Tokens, ExpressionNode Expressio public record BoundAssignmentNode(IEnumerable Tokens, BoundExpressionNode Expression, BoundExpressionNode Value) : BoundStatementNode(Tokens); public record IfNode(IEnumerable Tokens, ExpressionNode Condition, BlockNode Body, Optional> Else) : StatementNode(Tokens); -public record BoundIfNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlockNode Body, Optional> Else) : BoundStatementNode(Tokens); +public record BoundIfNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlock Body, Optional> Else) : BoundStatementNode(Tokens); public record VariableDeclarationNode(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment) : StatementNode(Tokens); public record BoundVariableDeclarationNode(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment, NubType Type) : BoundStatementNode(Tokens); @@ -29,4 +29,4 @@ public record BreakNode(IEnumerable Tokens) : StatementNode(Tokens); public record BoundBreakNode(IEnumerable Tokens) : BoundStatementNode(Tokens); public record WhileNode(IEnumerable Tokens, ExpressionNode Condition, BlockNode Body) : StatementNode(Tokens); -public record BoundWhileNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlockNode Body) : BoundStatementNode(Tokens); \ No newline at end of file +public record BoundWhileNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlock Body) : BoundStatementNode(Tokens); \ No newline at end of file diff --git a/src/compiler/Syntax/Node/SyntaxTree.cs b/src/compiler/Syntax/Node/SyntaxTree.cs new file mode 100644 index 0000000..53c312c --- /dev/null +++ b/src/compiler/Syntax/Node/SyntaxTree.cs @@ -0,0 +1,4 @@ +namespace Syntax.Node; + +public record SyntaxTree(string Namespace, List Definitions); +public record BoundSyntaxTree(string Namespace, List Definitions); diff --git a/src/compiler/Syntax/Parsing/SyntaxTree.cs b/src/compiler/Syntax/Parsing/SyntaxTree.cs deleted file mode 100644 index 4865724..0000000 --- a/src/compiler/Syntax/Parsing/SyntaxTree.cs +++ /dev/null @@ -1,5 +0,0 @@ -using Syntax.Node; - -namespace Syntax.Parsing; - -public record SyntaxTree(string Namespace, List Definitions);