um_atomo estado_branco (char **entrada)
{
    um_atomo a = NULL;
    
    // Excetuando o caso de brancos, as entradas so serao consumidas dentro
    // de seus respectivos estados
    if (ehBranco(**entrada))
        consome_entrada(entrada, 1);
    
    else if (ehLetra (**entrada) || **entrada == '_')
        estado_lexico = IDENTIFICADOR;
    
    else if (ehDigito (**entrada) || **entrada == '.')
        estado_lexico = NUMERO;
    
    else if (ehSimbolo (**entrada))
        estado_lexico = SIMBOLO;
    
    else if (**entrada == '%')
        estado_lexico = COMENTARIO;
    
    else if (**entrada == '\0')
        a = novoAtomoInteiro (C_FIM, linha);
    
    else
        a = novoAtomoInteiro (C_INVALIDA, linha);
    
    return a;
}
Beispiel #2
0
int verificaSimboloLido(char c){
	if(ehLetra(c)){ //Simbolo lido eh letra
		return 1;
	}
	if(ehNumero(c)){ //Simbolo lido eh numero
		return 2;
	}
	if(ehSimbolo(c)){ //Simbolo lido eh Caracter Especial
		return 3;
	}
	if(c=='/'){ //Simbolo lido eh '/'
		return 4;
	}
	if(c=='"'){
		return 5;
	}
	if(c==','){
		return 6;
	}

	return 0;
}
um_atomo estado_simbolo (char **entrada) 
{
    um_atomo a = NULL;
    uma_classe c;
    static uma_classe classe_valida;
    static char *nome, *simbolo_valido;
    static int pos=0, max=0;

    // Verifica se acabou de entrar nesse estado
    if (pos == 0)
    {
        nome = malloc (sizeof (char));
        simbolo_valido = NULL;
    }
    
    if (ehSimbolo ((*entrada)[pos]))
    {
        // Realoca mais 5 bytes ao símbolo, caso este estoure
        if (++pos > max)
        {
            max += 5;
            nome = realloc (nome, (max+1) * sizeof (char));
        }
        
        nome [pos-1] = (*entrada)[pos-1];
        nome [pos] = '\0';
        
        // Se o nome atual já for um símbolo, considera como válido
        c = busca_simbolo(nome);             
        if (c != C_INVALIDA)
        {
            // Se já existia um símbolo válido, detona ele
            if (simbolo_valido)
                free (simbolo_valido);
            
            simbolo_valido = malloc ((pos+1) * sizeof (char));
            strncpy (simbolo_valido, nome, pos+1);
            classe_valida = c;
        }
    }
    else
    {
        // Transição vazia
        estado_lexico = BRANCO;    
        
        free (nome);
        pos = 0;
    
        // Retorna o maior símbolo encontrado, ou C_INVALIDA
        if (simbolo_valido)
        {
            // Antes, consome entrada e libera memória
            consome_entrada (entrada, strlen (simbolo_valido));
            free (simbolo_valido);
            
            a = novoAtomoInteiro (classe_valida, 0);
        }
        else
            a = novoAtomoInteiro (C_INVALIDA, linha);
    }
    return a;
}