moi c plutot comme ca: tab=4 + espace quand il en faut
/**
Get in post-order the right variables assignments
*/
list<VarBase> Ast::getRightVariables(const tree<AstNode>::iterator& it, const VarBase& left)
{
list<VarBase> varBaseList;
unsigned nestedVars = nbNestedVariables(it);
if (nestedVars == 0)
return varBaseList;
else if (nestedVars == 1 && !detectAssignment(it)) {
VarBase simple = getSimpleVariable(it);
varBaseList.push_back(simple);
return varBaseList;
}
else
{
// Go to the last right 'expr_without_variable'
unsigned nbchilds = tr.number_of_children(it);
tree<AstNode>::iterator iter = tr.child(it, nbchilds - 1);
//
if (detectAssignment(iter)) {
// Assignment => Let's move to the right, and grab the left variable as a 'left variable'
VarBase leftVar = getLeftVariable(tr.child(iter, 0));
if (leftVar.name != "")
varBaseList.push_back(leftVar);
list<VarBase> rightVars = getRightVariables(tr.child(iter, 2), left);
// merge the result
for (list<VarBase>::const_iterator jt=rightVars.begin(); jt!=rightVars.end();++jt)
varBaseList.push_back(*jt);
}
else {
AstVarBaseList locVarList;
// get all variables, put that in a equivalences
for (tree<AstNode>::iterator jter = iter;jter != tr.end(iter); ++jter) {
string type(jter->getType());
if (type == "reference_variable")
{
unsigned nbchilds = tr.number_of_children(jter);
if (nbchilds == 1) {
if (tr.child(jter, 0)->getType() == "compound_variable") {
// single variables
tree<AstNode>::iterator var = jter;
for(;var->getType() != "text"; ++var)
;
//cerr << "I got this? " << var->getValue() << endl;
VarBase right(var->getValue(), it);
if (!(find(locVarList.begin(), locVarList.end(),right) != locVarList.end()))
locVarList.push_back(right);
jter = var;
}
}
else if (nbchilds == 4) {
// array ?
tree<AstNode>::iterator array = tr.child(jter, 0);
tree<AstNode>::iterator index = tr.child(jter, 2);
for(;array->getType() != "text" && array != tr.end(); ++array)
;
for(;index->getType() != "text" && index != tr.end(); ++index)
;
VarBase right(array->getValue(), it, index->getValue());
if (!(find(locVarList.begin(), locVarList.end(),right) != locVarList.end()))
locVarList.push_back(right);
jter = index;
}
}
else if (type == "expr_without_variable")
{
//cerr << "expr_wo_var ";
unsigned nbchilds = tr.number_of_children(iter);
//cerr << nbchilds << endl;
for (unsigned c=0;c<nbchilds;++c)
{
list<VarBase> varBaseListTemp = getSubVariables(tr.child(iter, c));
if (varBaseListTemp.size() > 0) {
// merge the list
for (list<VarBase>::const_iterator jter=varBaseListTemp.begin();jter!=varBaseListTemp.end();++jter) {
if (find(locVarList.begin(),locVarList.end(),*jter) == locVarList.end())
locVarList.push_back(*jter);
}
}
}
/*
// go to the T_VARIABLE
tree<AstNode>::iterator var = jter;
for(;var->getType() != "T_VARIABLE"; ++var)
;
var = tr.child(var, 0);
//cerr << "I got this? " << var->getValue() << endl;
VarBase right(var->getValue(), it);
if (!(find(locVarList.begin(), locVarList.end(),right) != locVarList.end()))
locVarList.push_back(right);
*/
}
}
// local equivalences
equivalences.insert(make_pair(left, locVarList));
}
return varBaseList;
}
}