From 1a5742fc4fef66233903d05536434fcd68332def Mon Sep 17 00:00:00 2001 From: Oliver Stene Date: Sun, 8 Feb 2026 15:53:00 +0100 Subject: [PATCH] ... --- compiler/Compiler/Generator.cs | 12 +++++++++++- compiler/Compiler/Parser.cs | 33 +++++++++++++++++++++++++-------- compiler/Compiler/Program.cs | 3 ++- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/compiler/Compiler/Generator.cs b/compiler/Compiler/Generator.cs index 5711184..e0a7d29 100644 --- a/compiler/Compiler/Generator.cs +++ b/compiler/Compiler/Generator.cs @@ -68,6 +68,9 @@ public sealed class Generator(List nodes) case NodeStatementVariableDeclaration statement: EmitStatementVariableDeclaration(statement); break; + case NodeStatementAssignment statement: + EmitStatementAssignment(statement); + break; default: throw new ArgumentOutOfRangeException(nameof(node), node, null); } @@ -87,7 +90,7 @@ public sealed class Generator(List nodes) private void EmitStatementFuncCall(NodeStatementFuncCall node) { - var name = EmitExpression(node.Func); + var name = EmitExpression(node.Target); var parameterValues = node.Parameters.Select(EmitExpression).ToList(); writer.WriteLine($"{name}({string.Join(", ", parameterValues)});"); } @@ -104,6 +107,13 @@ public sealed class Generator(List nodes) 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) { return node switch diff --git a/compiler/Compiler/Parser.cs b/compiler/Compiler/Parser.cs index bbf8f09..3228ef3 100644 --- a/compiler/Compiler/Parser.cs +++ b/compiler/Compiler/Parser.cs @@ -80,14 +80,25 @@ public sealed class Parser(List tokens) return new NodeStatementVariableDeclaration(TokensFrom(startIndex), name, type, value); } - var expression = ParseExpression(); - var parameters = new List(); + var target = ParseExpression(); - ExpectSymbol(Symbol.OpenParen); - while (!TryExpectSymbol(Symbol.CloseParen)) - parameters.Add(ParseExpression()); + if (TryExpectSymbol(Symbol.OpenParen)) + { + var parameters = new List(); - return new NodeStatementFuncCall(TokensFrom(startIndex), expression, parameters); + 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 Exception("Not a valid followup for expression statement"); } private NodeExpression ParseExpression() @@ -323,9 +334,9 @@ public sealed class NodeStatementBlock(List tokens, List s public readonly List Statements = statements; } -public sealed class NodeStatementFuncCall(List tokens, NodeExpression func, List parameters) : NodeStatement(tokens) +public sealed class NodeStatementFuncCall(List tokens, NodeExpression target, List parameters) : NodeStatement(tokens) { - public readonly NodeExpression Func = func; + public readonly NodeExpression Target = target; public readonly List Parameters = parameters; } @@ -341,6 +352,12 @@ internal class NodeStatementVariableDeclaration(List tokens, TokenIdent n public readonly NodeExpression Value = value; } +internal class NodeStatementAssignment(List tokens, NodeExpression target, NodeExpression value) : NodeStatement(tokens) +{ + public readonly NodeExpression Target = target; + public readonly NodeExpression Value = value; +} + public abstract class NodeExpression(List tokens) : Node(tokens); public sealed class NodeExpressionIntLiteral(List tokens, TokenIntLiteral value) : NodeExpression(tokens) diff --git a/compiler/Compiler/Program.cs b/compiler/Compiler/Program.cs index 9e1e27c..6a6d439 100644 --- a/compiler/Compiler/Program.cs +++ b/compiler/Compiler/Program.cs @@ -3,8 +3,9 @@ const string contents = """ func main(): i32 { let x: i32 = 23 + x = 24 do_something("test") - return 69 + return x } func do_something(text: string): void {