Fix variables not always recognized

This commit is contained in:
nub31
2025-02-01 20:10:58 +01:00
parent 896d5a5e13
commit 2b5969cf99
3 changed files with 52 additions and 52 deletions

View File

@@ -78,17 +78,46 @@ public class SymbolTable
variables.Add(new LocalVariable(parameter.Name, parameter.Type, offset)); variables.Add(new LocalVariable(parameter.Name, parameter.Type, offset));
} }
foreach (var statement in localFuncDefinition.Body.Statements) ResolveBlockVariables(localFuncDefinition.Body, variables, offset);
return variables;
}
private static int ResolveBlockVariables(BlockNode block, List<LocalVariable> variables, int offset)
{
foreach (var statement in block.Statements)
{ {
if (statement is VariableAssignmentNode variableAssignment) switch (statement)
{ {
offset += 8; case IfNode ifStatement:
variables.Add(new LocalVariable(variableAssignment.Name, variableAssignment.Value.Type, offset)); {
offset += ResolveBlockVariables(ifStatement.Body, variables, offset);
if (ifStatement.Else.HasValue)
{
ifStatement.Else.Value.Match
(
elseIfStatement => offset += ResolveBlockVariables(elseIfStatement.Body, variables, offset),
elseStatement => offset += ResolveBlockVariables(elseStatement, variables, offset)
);
}
break;
}
case WhileNode whileStatement:
{
offset += ResolveBlockVariables(whileStatement.Body, variables, offset);
break;
}
case VariableAssignmentNode variableAssignment:
{
offset += 8;
variables.Add(new LocalVariable(variableAssignment.Name, variableAssignment.Value.Type, offset));
break;
}
} }
} }
return variables; return offset;
} }
public Func ResolveFunc(string name, List<Type> parameterTypes) public Func ResolveFunc(string name, List<Type> parameterTypes)
{ {

View File

@@ -1,53 +1,21 @@
import "core"; import "core";
func main() { func main() {
let x = new Test
{
some_struct = new Test
{
some_struct = 0,
some_int = 420,
some_string = "blaze it"
},
some_int = 69,
some_string = "nice"
};
println(x.some_int);
println(x.some_string);
println(x.some_struct.some_int);
println(x.some_struct.some_string);
let x = new Array<String>(23);
x[23] = "test";
println(x[23]);
println(arr_size(x));
}
struct Test {
let some_struct: Test;
let some_string: String;
let some_int: int64;
}
func example() {
let some_string = "test";
println(some_string);
let some_array = new Array<int64>(2);
some_array[1] = 123;
some_array[2] = 124;
let i = 1; let i = 1;
while true {
println(some_array[1]); let x = new Human
println(some_array[2]); {
name = "test",
while i <= arr_size(some_array) { age = i
println(some_array[i]); };
println(x.age);
i = i + 1; i = i + 1;
} }
}
struct Human {
let name: String;
let age: int64;
} }

3
output/profile.sh Normal file
View File

@@ -0,0 +1,3 @@
#!/bin/sh
./build.sh
valgrind -s ./out