package compiler;

import java.util.HashMap;
import exception.UnknownIdentException;

/**
 * Tableau des identifiants pour la correspondance nom/valeur.
 * 
 */
public class TabIdent {
	static private HashMap<String, Ident> global = new HashMap<String, Ident>();
	static private HashMap<String, Ident> local = new HashMap<String, Ident>();
	
	/**
	 * Récupère un identifiant depuis la table.
	 * Les identifiants en contexte local sont prioritaires.
	 * @throws UnknownIdentException
	 */
	static Ident getIdent(String clef) throws UnknownIdentException {
		Ident i = local.get(clef);
		if (i == null)
			i = global.get(clef);
		if (i == null)
			throw new UnknownIdentException(clef);
		return i;
	}

	static void addIdent(String clef, Ident id) {
		global.put(clef, id);
	}
	static void addIdentLocal(String clef, Ident i){
		local.put(clef, i);
	}

	static boolean existeIdent(String clef) {
		return global.containsKey(clef) || local.containsKey(clef);
	}
	
	/**
	 * Dump tables for debug purpose.
	 */
	static public String dump(){
		String dump = new String("** TabIdent **\n");
		dump += "Variables globales\n";
		for (String name : global.keySet()) {
			dump += name+global.get(name).toString()+"\n";
		}
		dump += "Variables locales\n";
		for (String name : local.keySet()) {
			dump += name+local.get(name).toString()+"\n";
		}
		return dump;
	}
}
@@ -193,84 +193,8 @@
 %7B%0D%0A%09
-static private HashMap%3CString, Ident%3E global = new HashMap%3CString, Ident%3E();
 %0D%0A%09s
@@ -230,19 +230,20 @@
  Ident%3E 
+g
 lo
-c
+b
 al = new
@@ -329,67 +329,8 @@
 e.%0D%0A
-%09 * Les identifiants en contexte local sont prioritaires.%0D%0A
 %09 * 
@@ -440,60 +440,41 @@
 %0D%0A%09%09
-Ident i = local.get(clef);%0D%0A%09%09if (i == null)%0D%0A%09%09%09i =
+if (existeIdent(clef))%0D%0A%09%09%09return
  glo
@@ -495,22 +495,12 @@
 %0D%0A%09%09
-if (i == null)
+else
 %0D%0A%09%09
@@ -544,21 +544,8 @@
 );%0D%0A
-%09%09return i;%0D%0A
 %09%7D%0D%0A
@@ -623,24 +623,26 @@
 );%0D%0A%09%7D%0D%0A
+%0D%0A
 %09static 
 void add
@@ -637,78 +637,84 @@
 tic 
-void addIdentLocal(String clef, Ident i)%7B%0D%0A%09%09local.put
+boolean existeIdent(String clef) %7B%0D%0A%09%09return global.containsKey
 (clef
-, i
 );%0D%0A%09%7D%0D%0A
 %0D%0A%09s
@@ -713,51 +713,115 @@
 %09%7D%0D%0A
+%09
 %0D%0A%09
-static boolean existeIdent(String clef) 
+/**%0D%0A%09 * Donne le nombre de variables locales pour le bloc courant.%0D%0A%09 */%0D%0A%09static int countLocalVars()
 %7B%0D%0A%09
@@ -839,51 +839,13 @@
 bal.
-containsKey(clef) %7C%7C local.containsKey(clef
+size(
 );%0D%0A
@@ -1115,137 +1115,8 @@
 %09%7D%0D%0A
-%09%09dump += %22Variables locales%5Cn%22;%0D%0A%09%09for (String name : local.keySet()) %7B%0D%0A%09%09%09dump += name+local.get(name).toString()+%22%5Cn%22;%0D%0A%09%09%7D%0D%0A
 %09%09re

Remove local ident table