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; }
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; }