diff --git a/example/program.nub b/example/program.nub index 68a1406..2818f3b 100644 --- a/example/program.nub +++ b/example/program.nub @@ -11,5 +11,5 @@ global func main(argc: i64, argv: i64) { text = &text } - printf("%s\n", x.text) + printf("%s\n", (&x)^.text^) } \ No newline at end of file diff --git a/src/compiler/Nub.Lang/Backend/Generator.cs b/src/compiler/Nub.Lang/Backend/Generator.cs index c642581..c3aa160 100644 --- a/src/compiler/Nub.Lang/Backend/Generator.cs +++ b/src/compiler/Nub.Lang/Backend/Generator.cs @@ -539,6 +539,7 @@ public class Generator switch (addressOf.Expression.Type) { case NubPointerType: + case NubStructType: case NubPrimitiveType { Kind: PrimitiveTypeKind.String }: case NubPrimitiveType { Kind: PrimitiveTypeKind.I64 }: case NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }: diff --git a/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs b/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs index 197a9b7..80ec92f 100644 --- a/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs +++ b/src/compiler/Nub.Lang/Frontend/Parsing/Parser.cs @@ -230,6 +230,25 @@ public class Parser private ExpressionNode ParseExpression(int precedence = 0) { 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) { @@ -393,41 +412,17 @@ public class Parser return new IdentifierNode(identifier.Value); } - switch (token.Value) + if (token.Value is SymbolToken { Symbol: Symbol.OpenParen }) { - case SymbolToken symbolToken: + Next(); + List parameters = []; + while (!TryExpectSymbol(Symbol.CloseParen)) { - switch (symbolToken.Symbol) - { - case Symbol.Period: - { - Next(); - ExpressionNode result = new IdentifierNode(identifier.Value); - - do - { - var field = ExpectIdentifier(); - result = new StructFieldAccessorNode(result, field.Value); - } while (TryExpectSymbol(Symbol.Period)); - - return result; - } - case Symbol.OpenParen: - { - Next(); - List parameters = []; - while (!TryExpectSymbol(Symbol.CloseParen)) - { - parameters.Add(ParseExpression()); - TryExpectSymbol(Symbol.Comma); - } - - return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters)); - } - } - - break; + parameters.Add(ParseExpression()); + TryExpectSymbol(Symbol.Comma); } + + return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters)); } return new IdentifierNode(identifier.Value);