176Fermer178
nEUrOOLe 08/05/2008 à 02:42
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;
	}
}