예제 #1
0
/*******************************************************************************
 * 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 (mange_espaces() == -1)
        return FIN;

    c = lire_car();

    for (i = 0; i < nb_symboles; i++)
        if (table_symboles[i] == c)
            return code_symboles[i];

    if (is_num(c)) {
        do {
            c = lire_car();
        } while (is_num(c));
        delire_car();

        return NOMBRE;
    }

    if (is_maj(c) || is_min(c)) {
        do {
            if (yyleng >= YYTEXT_MAX - 1) {
                printf("Erreur ligne %d: un nom de fonction fait plus de 99 caractères\n", nb_ligne);
                exit(1);
            }

            c = lire_car();
        } while (is_maj(c) || is_min(c) || (c) == '_');
        delire_car();

        for (i = 0; i < nb_mots_clefs; i++)
            if (strcasecmp(table_mots_clefs[i], yytext) == 0)
                return code_mot_clefs[i];

        return ID_FCT;
    }

    if ((c) == '$') {
        do {
            if (yyleng >= YYTEXT_MAX - 1) {
                printf("Erreur ligne %d: un nom de variable fait plus de 99 caractères\n", nb_ligne);
                exit(1);
            }

            c = lire_car();
        } while (is_maj(c) || is_min(c) || is_num(c) || (c) == '_');
        delire_car();

        return ID_VAR;
    }

    printf("Erreur inconnue ligne %d.\n", nb_ligne);
    exit(1);
}
int analyser_mot(char c) {
	int count = 1;
	
	if (c == '$') {
	//	printf("analyser_mot VARIABLE c = %c \n", c);
		while(count < YYTEXT_MAX - 80) {
			c = lireCar();

			if (count < YYTEXT_MAX && !(is_num(c) || is_min(c) || is_maj(c) || c == '_')) {
				/*//printf("BEFORE, count = %i\n", count);
				for (int i = 0; i < YYTEXT_MAX - 1; i++) 
					printf("%c",yytext[i]);
				printf("\n");*/
				delireCar();
				/*printf("AFTER\n");
				for (int i = 0; i < YYTEXT_MAX - 1; i++) 
					printf("%c",yytext[i]);
				printf("\n");*/
				return ID_VAR;
			}
			else if (count >= YYTEXT_MAX) {
				delireCar();
				return -1;
			}
			count++;	
		} 
	}
	if (is_num(c)) {
		//printf("analyser_mot NUMBER c = %c \n", c);
		while(1) {
			c = lireCar();
			//printf("%c\n", c);
			if (!is_num(c)) {
				delireCar();
				return NOMBRE;
			} 
		}
	}
	//printf("analyser_mot FUNCTION/KEYWORD c = %c \n", c);
	while(count < YYTEXT_MAX) {
		c = lireCar();
		//printf("%c\n", c);
		if (count == YYTEXT_MAX - 1 && c != '(') {
			delireCar();
			return -1;
		}
		//printf("test1\n");
		if (!(is_num(c) || is_min(c) || is_maj(c) || c == '_')) {
			delireCar();
			int resultat = estMotClef();
			if (resultat != -1)
				return resultat;
			return ID_FCT;
		}
		count++;
	}
	return -1;
}
예제 #3
0
char	*ft_strcapitalize(char *str)
{
	int		i;
	int		word;

	i = 0;
	word = 0;
	while (str[i])
	{
		if ((is_min(str[i])) && (word == 0))
			str[i] = str[i] - 32;
		else if ((is_maj(str[i])) && (word == 1))
			str[i] = str[i] + 32;
		if (!(iss_alpha(str[i])))
			word = 0;
		else
			word = 1;
		i++;
	}
	return (str);
}