diff --git a/compiler/ast/ast.cpp b/compiler/ast/ast.cpp index 5c339d9..f692f2f 100644 --- a/compiler/ast/ast.cpp +++ b/compiler/ast/ast.cpp @@ -2,7 +2,18 @@ string ExprVar::linearize(CFG * cfg) { - return varName; + if(cfg->get_current_level() == cfg->get_level(varName)){ + return varName; + } + else + { + // TODO:: Gérer les erreurs + /* + Error *error = new Error(); + ErrorManager::addError(error); + */ + return NULL; + } } string ExprConst::linearize(CFG * cfg) diff --git a/compiler/intermediateRepresentation/CFG.cpp b/compiler/intermediateRepresentation/CFG.cpp index f6f90b6..20fbaa8 100644 --- a/compiler/intermediateRepresentation/CFG.cpp +++ b/compiler/intermediateRepresentation/CFG.cpp @@ -1,4 +1,7 @@ #include +#include +#include + using namespace std; #include "IR.h" @@ -15,6 +18,24 @@ CFG::~CFG() { } } +string CFG::get_current_level() +{ + return symbolTable->current_function; +} + +string CFG::get_level(string varName) +{ + //Extract the number after the last "_" in the variable name (ex : a_1, or get_var_2). + string level; + string token = strtok(varName,"_"); + while(token!= NULL) + { + level = token; + token = strtok(NULL, "-"); + } + return level; +} + void CFG::add_bb(BasicBlock *bb) { current_bb = bb; diff --git a/compiler/intermediateRepresentation/IR.h b/compiler/intermediateRepresentation/IR.h index de0a0f9..2e63aff 100644 --- a/compiler/intermediateRepresentation/IR.h +++ b/compiler/intermediateRepresentation/IR.h @@ -160,6 +160,8 @@ class CFG void add_to_symbol_table(string name, TypeSymbol t, StateSymbol stateSymbol); string create_new_tempvar(TypeSymbol t); int get_var_index(string name); + string get_current_level(); + string get_level(string varName); TypeSymbol get_var_type(string name); void assignSymbol(string name); bool isAssigneSymbol(string name);