Variable reassignment
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
@@ -106,12 +106,18 @@ public class Parser
|
||||
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:
|
||||
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:
|
||||
@@ -144,7 +150,9 @@ public class Parser
|
||||
}
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new Exception($"Unexpected token type {token.GetType().Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
7
Nub.Lang/Nub.Lang/Parsing/VariableReassignmentNode.cs
Normal file
7
Nub.Lang/Nub.Lang/Parsing/VariableReassignmentNode.cs
Normal 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;
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user