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

@@ -230,6 +230,25 @@ public class Parser
private ExpressionNode ParseExpression(int precedence = 0) private ExpressionNode ParseExpression(int precedence = 0)
{ {
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)
{ {
@@ -393,41 +412,17 @@ 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: Next();
List<ExpressionNode> parameters = [];
while (!TryExpectSymbol(Symbol.CloseParen))
{ {
switch (symbolToken.Symbol) parameters.Add(ParseExpression());
{ TryExpectSymbol(Symbol.Comma);
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<ExpressionNode> parameters = [];
while (!TryExpectSymbol(Symbol.CloseParen))
{
parameters.Add(ParseExpression());
TryExpectSymbol(Symbol.Comma);
}
return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters));
}
}
break;
} }
return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters));
} }
return new IdentifierNode(identifier.Value); return new IdentifierNode(identifier.Value);