...
This commit is contained in:
@@ -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^)
|
||||||
}
|
}
|
||||||
@@ -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 }:
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user