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

View File

@@ -11,5 +11,5 @@ global func main(argc: i64, argv: i64) {
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)
{
case NubPointerType:
case NubStructType:
case NubPrimitiveType { Kind: PrimitiveTypeKind.String }:
case NubPrimitiveType { Kind: PrimitiveTypeKind.I64 }:
case NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }:

View File

@@ -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<ExpressionNode> 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<ExpressionNode> 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);