Fix variables not always recognized
This commit is contained in:
@@ -78,16 +78,45 @@ public class SymbolTable
|
||||
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;
|
||||
variables.Add(new LocalVariable(variableAssignment.Name, variableAssignment.Value.Type, offset));
|
||||
case IfNode ifStatement:
|
||||
{
|
||||
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)
|
||||
|
||||
@@ -1,53 +1,21 @@
|
||||
import "core";
|
||||
|
||||
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;
|
||||
while true {
|
||||
let x = new Human
|
||||
{
|
||||
name = "test",
|
||||
age = i
|
||||
};
|
||||
|
||||
println(some_array[1]);
|
||||
println(some_array[2]);
|
||||
println(x.age);
|
||||
|
||||
while i <= arr_size(some_array) {
|
||||
println(some_array[i]);
|
||||
i = i + 1;
|
||||
}
|
||||
}
|
||||
|
||||
struct Human {
|
||||
let name: String;
|
||||
let age: int64;
|
||||
}
|
||||
3
output/profile.sh
Normal file
3
output/profile.sh
Normal file
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
./build.sh
|
||||
valgrind -s ./out
|
||||
Reference in New Issue
Block a user