Variable reassignment

This commit is contained in:
nub31
2025-01-26 22:23:48 +01:00
parent 0169382a77
commit 5e414ce09b
5 changed files with 47 additions and 11 deletions

View File

@@ -10,7 +10,7 @@ public class Generator
private readonly IReadOnlyCollection<DefinitionNode> _definitions;
private readonly SymbolTable _symbolTable;
private readonly StringBuilder _builder;
private Dictionary<string, string> _strings;
private readonly Dictionary<string, string> _strings;
private int _stringIndex;
public Generator(IReadOnlyCollection<DefinitionNode> definitions)
@@ -73,13 +73,13 @@ public class Generator
strlen:
push rcx ; save and clear out counter
xor rcx, rcx
.strlen_next:
strlen_next:
cmp [rdi], byte 0 ; null byte yet?
jz .strlen_null ; yes, get out
jz strlen_null ; yes, get out
inc rcx ; char is ok, count it
inc rdi ; move to next char
jmp .strlen_next ; process again
.strlen_null:
jmp strlen_next ; process again
strlen_null:
mov rax, rcx ; rcx = the length (put in rax)
pop rcx ; restore rcx
ret ; get out
@@ -154,6 +154,9 @@ public class Generator
case VariableAssignmentNode variableAssignment:
GenerateVariableAssignment(func, variableAssignment);
break;
case VariableReassignmentNode variableReassignment:
GenerateVariableReassignment(variableReassignment, func);
break;
default:
throw new ArgumentOutOfRangeException(nameof(statement));
}
@@ -171,8 +174,15 @@ public class Generator
private void GenerateVariableAssignment(Func func, VariableAssignmentNode variableAssignment)
{
GenerateExpression(variableAssignment.Value, func);
var variable = func.ResolveLocalVariable(variableAssignment.Name);
GenerateExpression(variableAssignment.Value, func);
_builder.AppendLine($" mov [rbp - {variable.Offset}], rax");
}
private void GenerateVariableReassignment(VariableReassignmentNode variableReassignment, Func func)
{
var variable = func.ResolveLocalVariable(variableReassignment.Name);
GenerateExpression(variableReassignment.Value, func);
_builder.AppendLine($" mov [rbp - {variable.Offset}], rax");
}

View File

@@ -4,9 +4,12 @@ let STD_OUT = 1;
let STD_ERR = 2;
func main() {
write("test\n");
let x = "test\n";
write(x);
x = "uwu\n";
write(x);
}
func write(msg: String): int64 {
return syscall(SYS_WRITE, STD_OUT, msg, strlen(msg));
func write(msg: String) {
syscall(SYS_WRITE, STD_OUT, msg, strlen(msg));
}

View File

@@ -109,11 +109,17 @@ public class Parser
return new FuncCallStatementNode(new FuncCall(identifier.Value, parameters));
}
case Symbol.Assign:
throw new NotImplementedException();
{
var value = ParseExpression();
ExpectSymbol(Symbol.Semicolon);
return new VariableReassignmentNode(identifier.Value, value);
}
default:
{
throw new Exception($"Unexpected symbol {symbol.Symbol}");
}
}
}
case SymbolToken symbol:
{
switch (symbol.Symbol)
@@ -144,9 +150,11 @@ public class Parser
}
}
default:
{
throw new Exception($"Unexpected token type {token.GetType().Name}");
}
}
}
private ExpressionNode ParseExpression()
{

View File

@@ -0,0 +1,7 @@
namespace Nub.Lang.Parsing;
public class VariableReassignmentNode(string name, ExpressionNode value) : StatementNode
{
public string Name { get; } = name;
public ExpressionNode Value { get; } = value;
}

View File

@@ -68,6 +68,9 @@ public class ExpressionTyper
case VariableAssignmentNode variableAssignment:
PopulateVariableAssignment(variableAssignment);
break;
case VariableReassignmentNode variableReassignment:
PopulateVariableReassignment(variableReassignment);
break;
default:
throw new ArgumentOutOfRangeException(nameof(statement));
}
@@ -103,6 +106,11 @@ public class ExpressionTyper
_variables.Push(new Variable(variableAssignment.Name, variableAssignment.Value.Type));
}
private void PopulateVariableReassignment(VariableReassignmentNode variableReassignment)
{
PopulateExpression(variableReassignment.Value);
}
private void PopulateExpression(ExpressionNode expression)
{
switch (expression)