From 0772b5094415b2cc8267aeb94ae1a62a5e158020 Mon Sep 17 00:00:00 2001 From: nub31 Date: Sat, 17 May 2025 22:25:39 +0200 Subject: [PATCH] ... --- example/program.nub | 20 ++++- .../Nub.Lang/Frontend/Parsing/Parser.cs | 82 +++++++++---------- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/example/program.nub b/example/program.nub index 21c647e..4473fc0 100644 --- a/example/program.nub +++ b/example/program.nub @@ -1,5 +1,23 @@ import c -global func main(argc: i64, argv: i64) { +struct Test { + name: ^string +} +struct Test2 { + parent: ^Test +} + +global func main(argc: i64, argv: i64) { + name = "Oliver" + + parent = new Test { + name = &name + } + + test = new Test2 { + parent = &parent + } + + printf("%s\n", test.parent^.name^) } \ No newline at end of file diff --git a/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs b/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs index 80ec92f..b8616bb 100644 --- a/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs +++ b/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs @@ -231,25 +231,6 @@ public class Parser { var left = ParsePrimaryExpression(); - if (TryExpectSymbol(Symbol.Caret)) - { - left = new DereferenceNode(left); - } - - if (TryExpectSymbol(Symbol.Period)) - { - do - { - var field = ExpectIdentifier(); - left = new StructFieldAccessorNode(left, field.Value); - } while (TryExpectSymbol(Symbol.Period)); - } - - if (TryExpectSymbol(Symbol.Caret)) - { - left = new DereferenceNode(left); - } - while (true) { var token = Peek(); @@ -335,7 +316,42 @@ public class Parser } case IdentifierToken identifier: { - return ParseExpressionIdentifier(identifier); + var next = Peek(); + switch (next.Value) + { + case SymbolToken { Symbol: Symbol.OpenParen }: + { + Next(); + List parameters = []; + while (!TryExpectSymbol(Symbol.CloseParen)) + { + parameters.Add(ParseExpression()); + TryExpectSymbol(Symbol.Comma); + } + + return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters)); + } + case SymbolToken { Symbol: Symbol.Period }: + { + Next(); + ExpressionNode expression = new IdentifierNode(identifier.Value); + do + { + var structMember = ExpectIdentifier().Value; + expression = new StructFieldAccessorNode(expression, structMember); + if (TryExpectSymbol(Symbol.Caret)) + { + expression = new DereferenceNode(expression); + } + } while (TryExpectSymbol(Symbol.Period)); + + return expression; + } + default: + { + return new IdentifierNode(identifier.Value); + } + } } case SymbolToken symbolToken: { @@ -352,7 +368,7 @@ public class Parser if (TryExpectSymbol(Symbol.CloseParen)) { - var expressionToCast = ParsePrimaryExpression(); + var expressionToCast = ParseExpression(); return new CastNode(type, expressionToCast); } @@ -400,32 +416,10 @@ public class Parser } } default: - throw new Exception($"Unexpected token type {token.GetType().Name}"); - } - } - - private ExpressionNode ParseExpressionIdentifier(IdentifierToken identifier) - { - var token = Peek(); - if (!token.HasValue) - { - return new IdentifierNode(identifier.Value); - } - - if (token.Value is SymbolToken { Symbol: Symbol.OpenParen }) - { - Next(); - List parameters = []; - while (!TryExpectSymbol(Symbol.CloseParen)) { - parameters.Add(ParseExpression()); - TryExpectSymbol(Symbol.Comma); + throw new Exception($"Unexpected token type {token.GetType().Name}"); } - - return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters)); } - - return new IdentifierNode(identifier.Value); } private BlockNode ParseBlock()