From 69982017c5ce1a4391be0b4a38a1680f15565557 Mon Sep 17 00:00:00 2001 From: nub31 Date: Mon, 21 Jul 2025 17:06:31 +0200 Subject: [PATCH] ... --- src/compiler/NubLang/Syntax/Binding/Binder.cs | 20 +---- .../NubLang/Syntax/Binding/DefinitionTable.cs | 8 +- .../Syntax/Parsing/Node/DefinitionSyntax.cs | 10 +-- src/compiler/NubLang/Syntax/Parsing/Parser.cs | 73 ++++++++----------- .../NubLang/Syntax/Tokenization/Token.cs | 3 +- .../NubLang/Syntax/Tokenization/Tokenizer.cs | 3 +- 6 files changed, 42 insertions(+), 75 deletions(-) diff --git a/src/compiler/NubLang/Syntax/Binding/Binder.cs b/src/compiler/NubLang/Syntax/Binding/Binder.cs index d8918dc..31237b9 100644 --- a/src/compiler/NubLang/Syntax/Binding/Binder.cs +++ b/src/compiler/NubLang/Syntax/Binding/Binder.cs @@ -50,30 +50,14 @@ public sealed class Binder return node switch { ExternFuncSyntax definition => BindExternFuncDefinition(definition), - TraitImplSyntax definition => BindTraitImplementation(definition), - TraitSyntax definition => BindTraitDefinition(definition), + InterfaceSyntax definition => BindTraitDefinition(definition), LocalFuncSyntax definition => BindLocalFuncDefinition(definition), StructSyntax definition => BindStruct(definition), _ => throw new ArgumentOutOfRangeException(nameof(node)) }; } - private BoundTraitImpl BindTraitImplementation(TraitImplSyntax node) - { - var functions = new List(); - - foreach (var func in node.Functions) - { - var signature = BindFuncSignature(func.Signature); - var body = BindFuncBody(func.Body, signature.ReturnType, signature.Parameters); - - functions.Add(new BoundTraitFuncImpl(func.Tokens, func.Name, signature, body)); - } - - return new BoundTraitImpl(node.Tokens, node.Namespace, BindType(node.TraitType), BindType(node.ForType), functions); - } - - private BoundTrait BindTraitDefinition(TraitSyntax node) + private BoundTrait BindTraitDefinition(InterfaceSyntax node) { var functions = new List(); diff --git a/src/compiler/NubLang/Syntax/Binding/DefinitionTable.cs b/src/compiler/NubLang/Syntax/Binding/DefinitionTable.cs index 9dfc865..7cddd36 100644 --- a/src/compiler/NubLang/Syntax/Binding/DefinitionTable.cs +++ b/src/compiler/NubLang/Syntax/Binding/DefinitionTable.cs @@ -46,15 +46,15 @@ public class DefinitionTable // .Where(x => x.Name == name); // } - public IEnumerable LookupTrait(NubCustomType type) + public IEnumerable LookupTrait(NubCustomType type) { return _definitions - .OfType() + .OfType() .Where(x => x.Namespace == type.Namespace && x.Name == type.Name); } - public IEnumerable LookupTraitFunc(TraitSyntax trait, string name) + public IEnumerable LookupTraitFunc(InterfaceSyntax @interface, string name) { - return trait.Functions.Where(x => x.Name == name); + return @interface.Functions.Where(x => x.Name == name); } } \ No newline at end of file diff --git a/src/compiler/NubLang/Syntax/Parsing/Node/DefinitionSyntax.cs b/src/compiler/NubLang/Syntax/Parsing/Node/DefinitionSyntax.cs index ce7f373..cf43144 100644 --- a/src/compiler/NubLang/Syntax/Parsing/Node/DefinitionSyntax.cs +++ b/src/compiler/NubLang/Syntax/Parsing/Node/DefinitionSyntax.cs @@ -17,12 +17,10 @@ public record ExternFuncSyntax(IReadOnlyList Tokens, string Namespace, IR public record StructFieldSyntax(IReadOnlyList Tokens, int Index, string Name, TypeSyntax Type, Optional Value) : SyntaxNode(Tokens); -public record StructSyntax(IReadOnlyList Tokens, string Namespace, IReadOnlyList Parameters, string Name, IReadOnlyList Fields) : DefinitionSyntax(Tokens, Namespace, Parameters); +public record StructFuncSyntax(IReadOnlyList Tokens, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : SyntaxNode(Tokens); -public record TraitFuncSyntax(IReadOnlyList Tokens, string Name, FuncSignatureSyntax Signature) : SyntaxNode(Tokens); +public record StructSyntax(IReadOnlyList Tokens, string Namespace, IReadOnlyList Parameters, string Name, IReadOnlyList Fields, IReadOnlyList Funcs) : DefinitionSyntax(Tokens, Namespace, Parameters); -public record TraitSyntax(IReadOnlyList Tokens, string Namespace, IReadOnlyList Parameters, string Name, IReadOnlyList Functions) : DefinitionSyntax(Tokens, Namespace, Parameters); +public record InterfaceFuncSyntax(IReadOnlyList Tokens, string Name, FuncSignatureSyntax Signature) : SyntaxNode(Tokens); -public record TraitFuncImplSyntax(IReadOnlyList Tokens, string Name, FuncSignatureSyntax Signature, BlockSyntax Body) : SyntaxNode(Tokens); - -public record TraitImplSyntax(IReadOnlyList Tokens, string Namespace, IReadOnlyList Parameters, TypeSyntax TraitType, TypeSyntax ForType, IReadOnlyList Functions) : DefinitionSyntax(Tokens, Namespace, Parameters); \ No newline at end of file +public record InterfaceSyntax(IReadOnlyList Tokens, string Namespace, IReadOnlyList Parameters, string Name, IReadOnlyList Functions) : DefinitionSyntax(Tokens, Namespace, Parameters); \ No newline at end of file diff --git a/src/compiler/NubLang/Syntax/Parsing/Parser.cs b/src/compiler/NubLang/Syntax/Parsing/Parser.cs index 0c5ad9f..618e100 100644 --- a/src/compiler/NubLang/Syntax/Parsing/Parser.cs +++ b/src/compiler/NubLang/Syntax/Parsing/Parser.cs @@ -67,8 +67,7 @@ public sealed class Parser Symbol.Extern => ParseExtern(startIndex, name, templateParameters), Symbol.Func => ParseFunc(startIndex, name, templateParameters), Symbol.Struct => ParseStruct(startIndex, name, templateParameters), - Symbol.Trait => ParseTrait(startIndex, name, templateParameters), - Symbol.Impl => ParseImpl(startIndex, name, templateParameters), + Symbol.Interface => ParseInterface(startIndex, name, templateParameters), _ => throw new ParseException(Diagnostic .Error($"Expected 'extern', 'func', 'struct', 'trait' or 'impl' but found '{keyword.Symbol}'") .WithHelp("Valid definition keywords are 'extern', 'func', 'struct', 'trait' and 'impl'") @@ -84,7 +83,7 @@ public sealed class Parser while (Peek().HasValue) { var token = Peek().Value; - if (token is SymbolToken { Symbol: Symbol.Extern or Symbol.Func or Symbol.Struct or Symbol.Trait or Symbol.Impl }) + if (token is SymbolToken { Symbol: Symbol.Extern or Symbol.Func or Symbol.Struct or Symbol.Interface }) { break; } @@ -176,35 +175,47 @@ public sealed class Parser ExpectSymbol(Symbol.OpenBrace); List fields = []; + List funcs = []; var fieldIndex = 0; while (!TryExpectSymbol(Symbol.CloseBrace)) { - var fieldStartIndex = _tokenIndex; + var memberStartIndex = _tokenIndex; - var fieldName = ExpectIdentifier().Value; - ExpectSymbol(Symbol.Colon); - var fieldType = ParseType(); - - var fieldValue = Optional.Empty(); - - if (TryExpectSymbol(Symbol.Assign)) + if (TryExpectSymbol(Symbol.Func)) { - fieldValue = ParseExpression(); + var funcName = ExpectIdentifier().Value; + var funcSignature = ParseFuncSignature(new FuncParameterSyntax([], "this", new CustomTypeSyntax([], _namespace, name.Value))); + var funcBody = ParseBlock(); + + funcs.Add(new StructFuncSyntax(GetTokens(memberStartIndex), funcName, funcSignature, funcBody)); } + else + { + var fieldName = ExpectIdentifier().Value; + ExpectSymbol(Symbol.Colon); + var fieldType = ParseType(); - fields.Add(new StructFieldSyntax(GetTokens(fieldStartIndex), fieldIndex++, fieldName, fieldType, fieldValue)); + var fieldValue = Optional.Empty(); + + if (TryExpectSymbol(Symbol.Assign)) + { + fieldValue = ParseExpression(); + } + + fields.Add(new StructFieldSyntax(GetTokens(memberStartIndex), fieldIndex++, fieldName, fieldType, fieldValue)); + } } - return new StructSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, fields); + return new StructSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, fields, funcs); } - private TraitSyntax ParseTrait(int startIndex, IdentifierToken name, IReadOnlyList templateParameters) + private InterfaceSyntax ParseInterface(int startIndex, IdentifierToken name, IReadOnlyList templateParameters) { ExpectSymbol(Symbol.OpenBrace); - List functions = []; + List functions = []; while (!TryExpectSymbol(Symbol.CloseBrace)) { @@ -215,34 +226,10 @@ public sealed class Parser var funcName = ExpectIdentifier().Value; var signature = ParseFuncSignature(); - functions.Add(new TraitFuncSyntax(GetTokens(funcStartIndex), funcName, signature)); + functions.Add(new InterfaceFuncSyntax(GetTokens(funcStartIndex), funcName, signature)); } - return new TraitSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, functions); - } - - private TraitImplSyntax ParseImpl(int startIndex, IdentifierToken name, IReadOnlyList templateParameters) - { - var traitType = ParseType(); - ExpectSymbol(Symbol.For); - var forType = ParseType(); - - List functions = []; - - ExpectSymbol(Symbol.OpenBrace); - while (!TryExpectSymbol(Symbol.CloseBrace)) - { - var funcStartIndex = _tokenIndex; - ExpectSymbol(Symbol.Func); - var functionName = ExpectIdentifier().Value; - - var signature = ParseFuncSignature(new FuncParameterSyntax([], "this", forType)); - var body = ParseBlock(); - - functions.AddRange(new TraitFuncImplSyntax(GetTokens(funcStartIndex), functionName, signature, body)); - } - - return new TraitImplSyntax(GetTokens(startIndex), _namespace, templateParameters, traitType, forType, functions); + return new InterfaceSyntax(GetTokens(startIndex), _namespace, templateParameters, name.Value, functions); } private StatementSyntax ParseStatement() @@ -252,7 +239,7 @@ public sealed class Parser { throw new ParseException(Diagnostic .Error("Unexpected end of file while parsing statement") - .At(_tokens.Last()) + .At(_tokens[^1]) .Build()); } diff --git a/src/compiler/NubLang/Syntax/Tokenization/Token.cs b/src/compiler/NubLang/Syntax/Tokenization/Token.cs index 08cf2a6..03b39de 100644 --- a/src/compiler/NubLang/Syntax/Tokenization/Token.cs +++ b/src/compiler/NubLang/Syntax/Tokenization/Token.cs @@ -67,8 +67,7 @@ public enum Symbol Let, Alloc, Calls, - Trait, - Impl, + Interface, For, Extern, Semi, diff --git a/src/compiler/NubLang/Syntax/Tokenization/Tokenizer.cs b/src/compiler/NubLang/Syntax/Tokenization/Tokenizer.cs index 7dc0731..0a43728 100644 --- a/src/compiler/NubLang/Syntax/Tokenization/Tokenizer.cs +++ b/src/compiler/NubLang/Syntax/Tokenization/Tokenizer.cs @@ -19,8 +19,7 @@ public sealed class Tokenizer ["struct"] = Symbol.Struct, ["let"] = Symbol.Let, ["calls"] = Symbol.Calls, - ["trait"] = Symbol.Trait, - ["impl"] = Symbol.Impl, + ["interface"] = Symbol.Interface, ["for"] = Symbol.For, ["extern"] = Symbol.Extern, };