This commit is contained in:
nub31
2025-05-17 22:35:08 +02:00
parent 6df13862a5
commit 6c04e39071
2 changed files with 48 additions and 26 deletions

View File

@@ -19,5 +19,5 @@ global func main(argc: i64, argv: i64) {
parent = &parent parent = &parent
} }
printf("%s\n", test.parent^.name^) printf("%s\n", (&test)^.parent^.name^)
} }

View File

@@ -308,11 +308,14 @@ public class Parser
private ExpressionNode ParsePrimaryExpression() private ExpressionNode ParsePrimaryExpression()
{ {
var token = ExpectToken(); var token = ExpectToken();
ExpressionNode expr;
switch (token) switch (token)
{ {
case LiteralToken literal: case LiteralToken literal:
{ {
return new LiteralNode(literal.Value, literal.Type); expr = new LiteralNode(literal.Value, literal.Type);
break;
} }
case IdentifierToken identifier: case IdentifierToken identifier:
{ {
@@ -329,29 +332,16 @@ public class Parser
TryExpectSymbol(Symbol.Comma); TryExpectSymbol(Symbol.Comma);
} }
return new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters)); expr = new FuncCallExpressionNode(new FuncCall(identifier.Value, parameters));
} break;
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: default:
{ {
return new IdentifierNode(identifier.Value); expr = new IdentifierNode(identifier.Value);
break;
} }
} }
break;
} }
case SymbolToken symbolToken: case SymbolToken symbolToken:
{ {
@@ -369,7 +359,8 @@ public class Parser
if (TryExpectSymbol(Symbol.CloseParen)) if (TryExpectSymbol(Symbol.CloseParen))
{ {
var expressionToCast = ParseExpression(); var expressionToCast = ParseExpression();
return new CastNode(type, expressionToCast); expr = new CastNode(type, expressionToCast);
break;
} }
_index = startIndex; _index = startIndex;
@@ -377,7 +368,8 @@ public class Parser
var expression = ParseExpression(); var expression = ParseExpression();
ExpectSymbol(Symbol.CloseParen); ExpectSymbol(Symbol.CloseParen);
return expression; expr = expression;
break;
} }
case Symbol.New: case Symbol.New:
{ {
@@ -392,34 +384,64 @@ public class Parser
initializers.Add(name, value); initializers.Add(name, value);
} }
return new StructInitializerNode(type, initializers); expr = new StructInitializerNode(type, initializers);
break;
} }
case Symbol.Ampersand: case Symbol.Ampersand:
{ {
var expression = ParsePrimaryExpression(); var expression = ParsePrimaryExpression();
return new AddressOfNode(expression); expr = new AddressOfNode(expression);
break;
} }
case Symbol.Minus: case Symbol.Minus:
{ {
var expression = ParsePrimaryExpression(); var expression = ParsePrimaryExpression();
return new UnaryExpressionNode(UnaryExpressionOperator.Negate, expression); expr = new UnaryExpressionNode(UnaryExpressionOperator.Negate, expression);
break;
} }
case Symbol.Bang: case Symbol.Bang:
{ {
var expression = ParsePrimaryExpression(); var expression = ParsePrimaryExpression();
return new UnaryExpressionNode(UnaryExpressionOperator.Invert, expression); expr = new UnaryExpressionNode(UnaryExpressionOperator.Invert, expression);
break;
} }
default: default:
{ {
throw new Exception($"Unknown symbol: {symbolToken.Symbol}"); throw new Exception($"Unknown symbol: {symbolToken.Symbol}");
} }
} }
break;
} }
default: default:
{ {
throw new Exception($"Unexpected token type {token.GetType().Name}"); throw new Exception($"Unexpected token type {token.GetType().Name}");
} }
} }
return ParsePostfixOperators(expr);
}
private ExpressionNode ParsePostfixOperators(ExpressionNode expr)
{
while (true)
{
if (TryExpectSymbol(Symbol.Caret))
{
expr = new DereferenceNode(expr);
continue;
}
if (TryExpectSymbol(Symbol.Period))
{
var structMember = ExpectIdentifier().Value;
expr = new StructFieldAccessorNode(expr, structMember);
continue;
}
break;
}
return expr;
} }
private BlockNode ParseBlock() private BlockNode ParseBlock()