expression function calls
This commit is contained in:
@@ -135,23 +135,13 @@ public sealed class Parser(string fileName, List<Token> tokens)
|
||||
|
||||
var target = ParseExpression();
|
||||
|
||||
if (TryExpectSymbol(Symbol.OpenParen))
|
||||
{
|
||||
var parameters = new List<NodeExpression>();
|
||||
|
||||
while (!TryExpectSymbol(Symbol.CloseParen))
|
||||
parameters.Add(ParseExpression());
|
||||
|
||||
return new NodeStatementFuncCall(TokensFrom(startIndex), target, parameters);
|
||||
}
|
||||
|
||||
if (TryExpectSymbol(Symbol.Equal))
|
||||
{
|
||||
var value = ParseExpression();
|
||||
return new NodeStatementAssignment(TokensFrom(startIndex), target, value);
|
||||
}
|
||||
|
||||
throw new CompileException(Diagnostic.Error("Cannot use expression in statement context unless called as a function or used in assignment").At(fileName, target).Build());
|
||||
return new NodeStatementExpression(TokensFrom(startIndex), target);
|
||||
}
|
||||
|
||||
private NodeExpression ParseExpression(int minPrecedence = -1)
|
||||
@@ -273,10 +263,26 @@ public sealed class Parser(string fileName, List<Token> tokens)
|
||||
throw new CompileException(Diagnostic.Error("Expected start of expression").At(fileName, Peek()).Build());
|
||||
}
|
||||
|
||||
if (TryExpectSymbol(Symbol.Period))
|
||||
while (true)
|
||||
{
|
||||
var name = ExpectIdent();
|
||||
expr = new NodeExpressionMemberAccess(TokensFrom(startIndex), expr, name);
|
||||
if (TryExpectSymbol(Symbol.Period))
|
||||
{
|
||||
var name = ExpectIdent();
|
||||
expr = new NodeExpressionMemberAccess(TokensFrom(startIndex), expr, name);
|
||||
}
|
||||
else if (TryExpectSymbol(Symbol.OpenParen))
|
||||
{
|
||||
var parameters = new List<NodeExpression>();
|
||||
|
||||
while (!TryExpectSymbol(Symbol.CloseParen))
|
||||
parameters.Add(ParseExpression());
|
||||
|
||||
expr = new NodeExpressionFuncCall(TokensFrom(startIndex), expr, parameters);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return expr;
|
||||
@@ -574,10 +580,9 @@ public sealed class NodeStatementBlock(List<Token> tokens, List<NodeStatement> s
|
||||
public List<NodeStatement> Statements { get; } = statements;
|
||||
}
|
||||
|
||||
public sealed class NodeStatementFuncCall(List<Token> tokens, NodeExpression target, List<NodeExpression> parameters) : NodeStatement(tokens)
|
||||
public sealed class NodeStatementExpression(List<Token> tokens, NodeExpression expression) : NodeStatement(tokens)
|
||||
{
|
||||
public NodeExpression Target { get; } = target;
|
||||
public List<NodeExpression> Parameters { get; } = parameters;
|
||||
public NodeExpression Expression { get; } = expression;
|
||||
}
|
||||
|
||||
public sealed class NodeStatementReturn(List<Token> tokens, NodeExpression value) : NodeStatement(tokens)
|
||||
@@ -647,6 +652,12 @@ public sealed class NodeExpressionMemberAccess(List<Token> tokens, NodeExpressio
|
||||
public TokenIdent Name { get; } = name;
|
||||
}
|
||||
|
||||
public sealed class NodeExpressionFuncCall(List<Token> tokens, NodeExpression target, List<NodeExpression> parameters) : NodeExpression(tokens)
|
||||
{
|
||||
public NodeExpression Target { get; } = target;
|
||||
public List<NodeExpression> Parameters { get; } = parameters;
|
||||
}
|
||||
|
||||
public sealed class NodeExpressionLocalIdent(List<Token> tokens, TokenIdent value) : NodeExpression(tokens)
|
||||
{
|
||||
public TokenIdent Value { get; } = value;
|
||||
|
||||
Reference in New Issue
Block a user