This commit is contained in:
nub31
2025-05-17 20:16:24 +02:00
parent df8557be86
commit b6b88228a4
3 changed files with 29 additions and 33 deletions

View File

@@ -11,5 +11,5 @@ global func main(argc: i64, argv: i64) {
text = &text text = &text
} }
printf("%s\n", x.text) printf("%s\n", (&x)^.text^)
} }

View File

@@ -539,6 +539,7 @@ public class Generator
switch (addressOf.Expression.Type) switch (addressOf.Expression.Type)
{ {
case NubPointerType: case NubPointerType:
case NubStructType:
case NubPrimitiveType { Kind: PrimitiveTypeKind.String }: case NubPrimitiveType { Kind: PrimitiveTypeKind.String }:
case NubPrimitiveType { Kind: PrimitiveTypeKind.I64 }: case NubPrimitiveType { Kind: PrimitiveTypeKind.I64 }:
case NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }: case NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }:

View File

@@ -231,6 +231,25 @@ public class Parser
{ {
var left = ParsePrimaryExpression(); 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) while (true)
{ {
var token = Peek(); var token = Peek();
@@ -393,26 +412,7 @@ public class Parser
return new IdentifierNode(identifier.Value); return new IdentifierNode(identifier.Value);
} }
switch (token.Value) if (token.Value is SymbolToken { Symbol: Symbol.OpenParen })
{
case SymbolToken symbolToken:
{
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(); Next();
List<ExpressionNode> parameters = []; List<ExpressionNode> parameters = [];
@@ -424,11 +424,6 @@ public class Parser
return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters)); return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters));
} }
}
break;
}
}
return new IdentifierNode(identifier.Value); return new IdentifierNode(identifier.Value);
} }