From f93ae274379a11716a2b4700f60ab933056ca501 Mon Sep 17 00:00:00 2001 From: nub31 Date: Thu, 3 Jul 2025 19:16:28 +0200 Subject: [PATCH] ... --- example/src/main.nub | 12 ++------ src/compiler/Syntax/Parsing/Node/Statement.cs | 2 +- src/compiler/Syntax/Parsing/Parser.cs | 30 +++++++++++-------- src/compiler/Syntax/Typing/Binder.cs | 25 ++++++++++++---- .../Syntax/Typing/BoundNode/Statement.cs | 2 +- 5 files changed, 41 insertions(+), 30 deletions(-) diff --git a/example/src/main.nub b/example/src/main.nub index eea1134..bd2611d 100644 --- a/example/src/main.nub +++ b/example/src/main.nub @@ -13,17 +13,9 @@ struct Human export func main(args: []cstring): i64 { - let x: Human = alloc Human - { - name = alloc Name - { - first = "john" - last = "doe" - } - age = 23 - } + let x: cstring = "test" - c::puts(x.name.last) + c::puts(x) return 0 } diff --git a/src/compiler/Syntax/Parsing/Node/Statement.cs b/src/compiler/Syntax/Parsing/Node/Statement.cs index a65115c..eee6a77 100644 --- a/src/compiler/Syntax/Parsing/Node/Statement.cs +++ b/src/compiler/Syntax/Parsing/Node/Statement.cs @@ -9,7 +9,7 @@ public record StatementExpressionNode(IEnumerable Tokens, ExpressionNode public record ReturnNode(IEnumerable Tokens, Optional Value) : StatementNode(Tokens); public record AssignmentNode(IEnumerable Tokens, ExpressionNode Expression, ExpressionNode Value) : StatementNode(Tokens); public record IfNode(IEnumerable Tokens, ExpressionNode Condition, BlockNode Body, Optional> Else) : StatementNode(Tokens); -public record VariableDeclarationNode(IEnumerable Tokens, string Name, NubType Type, Optional Assignment) : StatementNode(Tokens); +public record VariableDeclarationNode(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment) : StatementNode(Tokens); public record ContinueNode(IEnumerable Tokens) : StatementNode(Tokens); public record BreakNode(IEnumerable Tokens) : StatementNode(Tokens); public record WhileNode(IEnumerable Tokens, ExpressionNode Condition, BlockNode Body) : StatementNode(Tokens); diff --git a/src/compiler/Syntax/Parsing/Parser.cs b/src/compiler/Syntax/Parsing/Parser.cs index b8aa056..d211f72 100644 --- a/src/compiler/Syntax/Parsing/Parser.cs +++ b/src/compiler/Syntax/Parsing/Parser.cs @@ -125,7 +125,7 @@ public static class Parser } var callName = name.Value; - + if (TryExpectSymbol(Symbol.Calls)) { callName = ExpectIdentifier().Value; @@ -235,16 +235,20 @@ public static class Parser { ExpectSymbol(Symbol.Let); var name = ExpectIdentifier().Value; - ExpectSymbol(Symbol.Colon); - var type = ParseType(); - Optional assignment = Optional.Empty(); + var explicitType = Optional.Empty(); + if (TryExpectSymbol(Symbol.Colon)) + { + explicitType = ParseType(); + } + + var assignment = Optional.Empty(); if (TryExpectSymbol(Symbol.Assign)) { assignment = ParseExpression(); } - - return new VariableDeclarationNode(GetTokensForNode(startIndex), name, type, assignment); + + return new VariableDeclarationNode(GetTokensForNode(startIndex), name, explicitType, assignment); } private static StatementNode ParseBreak(int startIndex) @@ -428,7 +432,7 @@ public static class Parser } var returnType = TryExpectSymbol(Symbol.Colon) ? ParseType() : new NubVoidType(); - + var body = ParseBlock(); expr = new AnonymousFuncNode(GetTokensForNode(startIndex), parameters, body, returnType); @@ -519,7 +523,7 @@ public static class Parser expr = new AddressOfNode(GetTokensForNode(startIndex), expr); break; } - + if (TryExpectSymbol(Symbol.Caret)) { expr = new DereferenceNode(GetTokensForNode(startIndex), expr); @@ -632,7 +636,7 @@ public static class Parser .Build()); } - return new NubStructType(@namespace , name.Value); + return new NubStructType(@namespace, name.Value); } if (TryExpectSymbol(Symbol.Caret)) @@ -640,7 +644,7 @@ public static class Parser var baseType = ParseType(); return new NubPointerType(baseType); } - + if (TryExpectSymbol(Symbol.Func)) { ExpectSymbol(Symbol.OpenParen); @@ -658,9 +662,9 @@ public static class Parser .Build()); } } - + var returnType = TryExpectSymbol(Symbol.Colon) ? ParseType() : new NubVoidType(); - + return new NubFuncType(returnType, parameters); } @@ -685,7 +689,7 @@ public static class Parser .WithHelp("Expected type name, '^' for pointer, or '[]' for array") .At(peekToken) .Build()); -} + } private static Token ExpectToken() { diff --git a/src/compiler/Syntax/Typing/Binder.cs b/src/compiler/Syntax/Typing/Binder.cs index 4d0a151..8899181 100644 --- a/src/compiler/Syntax/Typing/Binder.cs +++ b/src/compiler/Syntax/Typing/Binder.cs @@ -188,13 +188,29 @@ public static class Binder private static BoundVariableDeclarationNode BindVariableDeclaration(VariableDeclarationNode statement) { - _variables[statement.Name] = statement.Type; + NubType? type = null; + + if (statement.ExplicitType.HasValue) + { + type = statement.ExplicitType.Value; + } + var assignment = Optional.Empty(); if (statement.Assignment.HasValue) { - assignment = BindExpression(statement.Assignment.Value); + var boundValue = BindExpression(statement.Assignment.Value, type); + assignment = boundValue; + type = boundValue.Type; } - return new BoundVariableDeclarationNode(statement.Tokens, statement.Name, statement.Type, assignment); + + if (type == null) + { + throw new NotImplementedException("Diagnostics not implemented"); + } + + _variables[statement.Name] = type; + + return new BoundVariableDeclarationNode(statement.Tokens, statement.Name, statement.ExplicitType, assignment, type); } private static BoundWhileNode BindWhile(WhileNode statement) @@ -254,8 +270,7 @@ public static class Binder private static BoundArrayInitializerNode BindArrayInitializer(ArrayInitializerNode expression) { - return new BoundArrayInitializerNode(expression.Tokens, new NubArrayType(expression.ElementType), BindExpression(expression.Capacity, NubPrimitiveType.U64), - expression.ElementType); + return new BoundArrayInitializerNode(expression.Tokens, new NubArrayType(expression.ElementType), BindExpression(expression.Capacity, NubPrimitiveType.U64), expression.ElementType); } private static BoundBinaryExpressionNode BindBinaryExpression(BinaryExpressionNode expression) diff --git a/src/compiler/Syntax/Typing/BoundNode/Statement.cs b/src/compiler/Syntax/Typing/BoundNode/Statement.cs index 983cb8b..ef5da00 100644 --- a/src/compiler/Syntax/Typing/BoundNode/Statement.cs +++ b/src/compiler/Syntax/Typing/BoundNode/Statement.cs @@ -8,7 +8,7 @@ public record BoundStatementExpressionNode(IEnumerable Tokens, BoundExpre public record BoundReturnNode(IEnumerable Tokens, Optional Value) : BoundStatementNode(Tokens); public record BoundAssignmentNode(IEnumerable Tokens, BoundExpressionNode Expression, BoundExpressionNode Value) : BoundStatementNode(Tokens); public record BoundIfNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlockNode Body, Optional> Else) : BoundStatementNode(Tokens); -public record BoundVariableDeclarationNode(IEnumerable Tokens, string Name, NubType Type, Optional Assignment) : BoundStatementNode(Tokens); +public record BoundVariableDeclarationNode(IEnumerable Tokens, string Name, Optional ExplicitType, Optional Assignment, NubType Type) : BoundStatementNode(Tokens); public record BoundContinueNode(IEnumerable Tokens) : BoundStatementNode(Tokens); public record BoundBreakNode(IEnumerable Tokens) : BoundStatementNode(Tokens); public record BoundWhileNode(IEnumerable Tokens, BoundExpressionNode Condition, BoundBlockNode Body) : BoundStatementNode(Tokens);