This commit is contained in:
nub31
2025-05-17 22:25:39 +02:00
parent db57b0775a
commit 6df13862a5
2 changed files with 57 additions and 45 deletions

View File

@@ -1,5 +1,23 @@
import c 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^)
} }

View File

@@ -231,25 +231,6 @@ 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();
@@ -335,7 +316,42 @@ public class Parser
} }
case IdentifierToken identifier: case IdentifierToken identifier:
{ {
return ParseExpressionIdentifier(identifier); var next = Peek();
switch (next.Value)
{
case SymbolToken { Symbol: Symbol.OpenParen }:
{
Next();
List<ExpressionNode> 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: case SymbolToken symbolToken:
{ {
@@ -352,7 +368,7 @@ public class Parser
if (TryExpectSymbol(Symbol.CloseParen)) if (TryExpectSymbol(Symbol.CloseParen))
{ {
var expressionToCast = ParsePrimaryExpression(); var expressionToCast = ParseExpression();
return new CastNode(type, expressionToCast); return new CastNode(type, expressionToCast);
} }
@@ -400,32 +416,10 @@ public class Parser
} }
} }
default: 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<ExpressionNode> parameters = [];
while (!TryExpectSymbol(Symbol.CloseParen))
{ {
parameters.Add(ParseExpression()); throw new Exception($"Unexpected token type {token.GetType().Name}");
TryExpectSymbol(Symbol.Comma);
} }
return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters));
} }
return new IdentifierNode(identifier.Value);
} }
private BlockNode ParseBlock() private BlockNode ParseBlock()