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

View File

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

View File

@@ -106,12 +106,18 @@ public class Parser
return new SyscallStatementNode(new Syscall(parameters)); return new SyscallStatementNode(new Syscall(parameters));
} }
return new FuncCallStatementNode(new FuncCall(identifier.Value, parameters)); return new FuncCallStatementNode(new FuncCall(identifier.Value, parameters));
} }
case Symbol.Assign: case Symbol.Assign:
throw new NotImplementedException(); {
var value = ParseExpression();
ExpectSymbol(Symbol.Semicolon);
return new VariableReassignmentNode(identifier.Value, value);
}
default: default:
{
throw new Exception($"Unexpected symbol {symbol.Symbol}"); throw new Exception($"Unexpected symbol {symbol.Symbol}");
}
} }
} }
case SymbolToken symbol: case SymbolToken symbol:
@@ -144,7 +150,9 @@ public class Parser
} }
} }
default: default:
{
throw new Exception($"Unexpected token type {token.GetType().Name}"); throw new Exception($"Unexpected token type {token.GetType().Name}");
}
} }
} }

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