package compiler;

import java.util.HashMap;

import exception.UnknownFunctionException;
import exception.UnknownIdentException;

/**
 * Tableau des identifiants pour la correspondance nom/valeur.
 * 
 */
public class TabIdent {
	
	static private HashMap<String, Ident> values = new HashMap<String, Ident>();
	static private HashMap<String, IdFun> functions = new HashMap<String, IdFun>();
	
	/**
	 * Récupère un identifiant depuis la table.
	 * @throws UnknownIdentException
	 */
	static Ident getIdent(String key) throws UnknownIdentException {
		if (existIdent(key))
			return values.get(key);
		else
			throw new UnknownIdentException(key);
	}
	
	static IdFun getFunction(String key) throws UnknownFunctionException {
		if (existFunction(key))
			return functions.get(key);
		else
			throw new UnknownFunctionException(key);
	}
	
	static IdFun getLastFunction() throws UnknownFunctionException{
		System.out.println(Yaka.expression.popFunction());
		return getFunction(Yaka.expression.popFunction());
	}
	
	static void addIdent(String key, Ident id) {
		values.put(key, id);
	}
	
	static void finalizeFunction(String key, IdFun id){
		//System.out.println("Add "+key+" to table function");
		functions.put(key, id);
	}
	
	static boolean existIdent(String key) {
		return values.containsKey(key);
	}
	
	static boolean existFunction(String key){
		//System.out.println("Check "+key+"");
		return functions.containsKey(key);
	}
	
	static void cleanIdentTable(){
		values.clear();
	}
	
	/**
	 * Donne le nombre de variables locales pour le bloc courant.
	 */
	static int countLocalVars(){
		return values.size() - Declaration.getCurrentFunction().getNumberOfParameters();
	}
	
	/**
	 * Dump tables for debug purpose.
	 */
	static public String dump(){
		String dump = new String("** TabIdent **\n");
		dump += "Variables globales\n";
		for (String name : values.keySet()) {
			dump += name+values.get(name).toString()+"\n";
		}
		return dump;
	}
}
@@ -662,32 +662,126 @@
 n(key);%0D%0A%09%7D%0D%0A%09%0D%0A
+%09/**%0D%0A%09 * R%C3%A9cup%C3%A8re une focntion depuis la table.%0D%0A%09 * @throws UnknownFunctionException%0D%0A%09 */%0D%0A
 %09static IdFun ge
@@ -947,32 +947,149 @@
 n(key);%0D%0A%09%7D%0D%0A%09%0D%0A
+%09/**%0D%0A%09 * Retourne la derni%C3%A8re fonction de la pile d'appel%0D%0A%09 * @return%0D%0A%09 * @throws UnknownFunctionException%0D%0A%09 */%0D%0A
 %09static IdFun ge
@@ -1140,16 +1140,18 @@
 ion%7B%0D%0A%09%09
+//
 System.o
@@ -1325,32 +1325,158 @@
 y, id);%0D%0A%09%7D%0D%0A%09%0D%0A
+%09/**%0D%0A%09 * Ajoute la fonction %C3%A0 la table des identifiants%0D%0A%09 * @param key nom de la fonction%0D%0A%09 * @param id la fonction%0D%0A%09 */%0D%0A
 %09static void fin
@@ -1610,89 +1610,380 @@
 %09%0D%0A%09
-static boolean existIdent(String key) %7B%0D%0A%09%09return values.containsKey(key);%0D%0A%09%7D%0D%0A%09
+/**%0D%0A%09 * Test l'existence d'un identifiant dans la table%0D%0A%09 * @param key le nom de l'identifiant%0D%0A%09 * @return vrai si l'identifiant existe%0D%0A%09 */%0D%0A%09static boolean existIdent(String key) %7B%0D%0A%09%09return values.containsKey(key);%0D%0A%09%7D%0D%0A%09%0D%0A%09%0D%0A%09/**%0D%0A%09 * Test l'existence d'une fonction dans la table%0D%0A%09 * @param key le nom de la fonction%0D%0A%09 * @return vrai si la fonction existe%0D%0A%09 */
 %0D%0A%09s
@@ -2103,32 +2103,139 @@
 y(key);%0D%0A%09%7D%0D%0A%09%0D%0A
+%09/**%0D%0A%09 * Vide la table des identifiants.%0D%0A%09 * Utilis%C3%A9 pour changer de contexte entre les fonctions%0D%0A%09 */%0D%0A
 %09static void cle

Remove debug function pop