/*******************************************************************************
 * Fonction principale de l'analyseur lexical, lit les caractères de yyin et
 * renvoie les tokens sous forme d'entier. Le code de chaque unité est défini 
 * dans symboles.h sinon (mot clé, idententifiant, etc.). Pour les tokens de 
 * type ID_FCT, ID_VAR et NOMBRE la valeur du token est dans yytext, visible 
 * dans l'analyseur syntaxique.
 ******************************************************************************/
int yylex(void)
{
  //char nom[100];
  //char valeur[100];
  char c;
  yytext[yyleng = 0] = '\0';
  if(mangeEspaces() == -1) 
    return FIN; 
     
  c = lireCar();
  int resultat = estSymboleSimple(c);
  if ( resultat != -1 ) {
 //nom_token(resultat,nom,valeur);
 //printf("token: %d  nom:%s  valeur: %s\n",resultat,nom,valeur);
    return resultat;
  }
  //int resultate = analyser_mot(c);
  //nom_token(resultate,nom,valeur);
 // printf("token: %d  nom:%s  valeur: %s\n",resultate,nom,valeur);
  
  return analyser_mot(c);
  
}
/*******************************************************************************
 * Fonction principale de l'analyseur lexical, lit les caractères de yyin et
 * renvoie les tokens sous forme d'entier. Le code de chaque unité est défini 
 * dans symboles.h sinon (mot clé, idententifiant, etc.). Pour les tokens de 
 * type ID_FCT, ID_VAR et NOMBRE la valeur du token est dans yytext, visible 
 * dans l'analyseur syntaxique.
 ******************************************************************************/
int yylex(void)
{
  char c;
  int i;
  yytext[yyleng = 0] = '\0';
  
  if (mangeEspaces() == -1)
    return FIN;

  c = lireCar();


  // Symbole simple
  for( int i = 0; tableSymbole[i] != '\0'; ++i ) {
    if( c == tableSymbole[i] ) {
      return codeSymbole[i];
    }
  }

  // Nombre
  if( is_num( c ) )
  {
    do {
      lireCar();
    } while( is_num( yytext[yyleng-1] ) );
    delireCar();

    return NOMBRE;
  }

  //id_var
  if( c == '$' ) {
    i = 1; // 1 pour $

    do {
      lireCar();
      i++;
    } while( is_alphanum( yytext[yyleng-1] ) );
    i--;
    delireCar();


    if(i > 99) {
      return -1;
    }
    
    return ID_VAR;
  }

  // Mot clefs
  do {
    lireCar();
  } while( is_alphanum( yytext[yyleng-1] ) );
  delireCar();

  for( int i = 0; tableMotsClefs[i] != '\0'; ++i )
  {
    if( strcmp( tableMotsClefs[i], yytext ) == 0 ) {
        return codeMotClefs[i];
    }
  }

  for(; yyleng != 1; delireCar() );

  //id_fct
  if( is_alpha( c ) ) {
    int i = 1; // 1 pour $

    do {
      lireCar();
      i++;

    } while( is_alphanum( yytext[yyleng-1] ) );
    i--;
    delireCar();

    if(i > 99) {
      return -1;
    }

    return ID_FCT;
  }

  erreur("Aucune Correspondance");  
  return -1;
}