Fix variables not always recognized
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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
3
output/profile.sh
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
./build.sh
|
||||||
|
valgrind -s ./out
|
||||||
Reference in New Issue
Block a user