This commit is contained in:
2026-02-08 15:53:00 +01:00
parent 4c201c4085
commit 1a5742fc4f
3 changed files with 38 additions and 10 deletions

View File

@@ -68,6 +68,9 @@ public sealed class Generator(List<NodeDefinition> nodes)
case NodeStatementVariableDeclaration statement: case NodeStatementVariableDeclaration statement:
EmitStatementVariableDeclaration(statement); EmitStatementVariableDeclaration(statement);
break; break;
case NodeStatementAssignment statement:
EmitStatementAssignment(statement);
break;
default: default:
throw new ArgumentOutOfRangeException(nameof(node), node, null); throw new ArgumentOutOfRangeException(nameof(node), node, null);
} }
@@ -87,7 +90,7 @@ public sealed class Generator(List<NodeDefinition> nodes)
private void EmitStatementFuncCall(NodeStatementFuncCall node) private void EmitStatementFuncCall(NodeStatementFuncCall node)
{ {
var name = EmitExpression(node.Func); var name = EmitExpression(node.Target);
var parameterValues = node.Parameters.Select(EmitExpression).ToList(); var parameterValues = node.Parameters.Select(EmitExpression).ToList();
writer.WriteLine($"{name}({string.Join(", ", parameterValues)});"); writer.WriteLine($"{name}({string.Join(", ", parameterValues)});");
} }
@@ -104,6 +107,13 @@ public sealed class Generator(List<NodeDefinition> nodes)
writer.WriteLine($"{CType(statement.Type)} {statement.Name.Ident} = {value};"); writer.WriteLine($"{CType(statement.Type)} {statement.Name.Ident} = {value};");
} }
private void EmitStatementAssignment(NodeStatementAssignment statement)
{
var target = EmitExpression(statement.Target);
var value = EmitExpression(statement.Value);
writer.WriteLine($"{target} = {value};");
}
private string EmitExpression(NodeExpression node) private string EmitExpression(NodeExpression node)
{ {
return node switch return node switch

View File

@@ -80,14 +80,25 @@ public sealed class Parser(List<Token> tokens)
return new NodeStatementVariableDeclaration(TokensFrom(startIndex), name, type, value); return new NodeStatementVariableDeclaration(TokensFrom(startIndex), name, type, value);
} }
var expression = ParseExpression(); var target = ParseExpression();
if (TryExpectSymbol(Symbol.OpenParen))
{
var parameters = new List<NodeExpression>(); var parameters = new List<NodeExpression>();
ExpectSymbol(Symbol.OpenParen);
while (!TryExpectSymbol(Symbol.CloseParen)) while (!TryExpectSymbol(Symbol.CloseParen))
parameters.Add(ParseExpression()); parameters.Add(ParseExpression());
return new NodeStatementFuncCall(TokensFrom(startIndex), expression, parameters); return new NodeStatementFuncCall(TokensFrom(startIndex), target, parameters);
}
if (TryExpectSymbol(Symbol.Equal))
{
var value = ParseExpression();
return new NodeStatementAssignment(TokensFrom(startIndex), target, value);
}
throw new Exception("Not a valid followup for expression statement");
} }
private NodeExpression ParseExpression() private NodeExpression ParseExpression()
@@ -323,9 +334,9 @@ public sealed class NodeStatementBlock(List<Token> tokens, List<NodeStatement> s
public readonly List<NodeStatement> Statements = statements; public readonly List<NodeStatement> Statements = statements;
} }
public sealed class NodeStatementFuncCall(List<Token> tokens, NodeExpression func, List<NodeExpression> parameters) : NodeStatement(tokens) public sealed class NodeStatementFuncCall(List<Token> tokens, NodeExpression target, List<NodeExpression> parameters) : NodeStatement(tokens)
{ {
public readonly NodeExpression Func = func; public readonly NodeExpression Target = target;
public readonly List<NodeExpression> Parameters = parameters; public readonly List<NodeExpression> Parameters = parameters;
} }
@@ -341,6 +352,12 @@ internal class NodeStatementVariableDeclaration(List<Token> tokens, TokenIdent n
public readonly NodeExpression Value = value; public readonly NodeExpression Value = value;
} }
internal class NodeStatementAssignment(List<Token> tokens, NodeExpression target, NodeExpression value) : NodeStatement(tokens)
{
public readonly NodeExpression Target = target;
public readonly NodeExpression Value = value;
}
public abstract class NodeExpression(List<Token> tokens) : Node(tokens); public abstract class NodeExpression(List<Token> tokens) : Node(tokens);
public sealed class NodeExpressionIntLiteral(List<Token> tokens, TokenIntLiteral value) : NodeExpression(tokens) public sealed class NodeExpressionIntLiteral(List<Token> tokens, TokenIntLiteral value) : NodeExpression(tokens)

View File

@@ -3,8 +3,9 @@
const string contents = """ const string contents = """
func main(): i32 { func main(): i32 {
let x: i32 = 23 let x: i32 = 23
x = 24
do_something("test") do_something("test")
return 69 return x
} }
func do_something(text: string): void { func do_something(text: string): void {