Variable reassignment
This commit is contained in:
@@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
@@ -109,11 +109,17 @@ public class Parser
|
|||||||
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:
|
||||||
{
|
{
|
||||||
switch (symbol.Symbol)
|
switch (symbol.Symbol)
|
||||||
@@ -144,9 +150,11 @@ public class Parser
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
{
|
||||||
throw new Exception($"Unexpected token type {token.GetType().Name}");
|
throw new Exception($"Unexpected token type {token.GetType().Name}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private ExpressionNode ParseExpression()
|
private ExpressionNode ParseExpression()
|
||||||
{
|
{
|
||||||
|
|||||||
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:
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user