/* * Nome: Leonardo Koosuke Azuma * SO: Arch Linux x86_64 * Compilador: gcc (GCC) 13.2.1 20230801 */ #include #include #include "include/map.h" #include "include/lexical.h" char proximo = '\n'; int is_EOF = 0; int linha = 0; // Numero da linha atual) int identificador_num = 1; FILE *fout; string_map special_char; string_map simbolos_especiais; string_map simbolos_especiais_composto; string_map simbolos_especiais_composto_negrito; string_map simbolos_identificadores; string_map simbolos_numeros; void init_simbolos_especiais_compostos_negrito(){ simbolos_especiais_composto_negrito = init_map(1031); insert_map("program", "secn01", simbolos_especiais_composto_negrito); insert_map("label", "secn02", simbolos_especiais_composto_negrito); insert_map("var", "secn03", simbolos_especiais_composto_negrito); insert_map("procedure", "secn04", simbolos_especiais_composto_negrito); insert_map("function", "secn05", simbolos_especiais_composto_negrito); insert_map("begin", "secn06", simbolos_especiais_composto_negrito); insert_map("end", "secn07", simbolos_especiais_composto_negrito); insert_map("if", "secn08", simbolos_especiais_composto_negrito); insert_map("then", "secn09", simbolos_especiais_composto_negrito); insert_map("else", "secn10", simbolos_especiais_composto_negrito); insert_map("while", "secn11", simbolos_especiais_composto_negrito); insert_map("do", "secn12", simbolos_especiais_composto_negrito); insert_map("or", "secn13", simbolos_especiais_composto_negrito); insert_map("and", "secn14", simbolos_especiais_composto_negrito); insert_map("div", "secn15", simbolos_especiais_composto_negrito); insert_map("not", "secn16", simbolos_especiais_composto_negrito); } void init_simbolos_especiais_compostos(){ simbolos_especiais_composto = init_map(1031); insert_map(":=", "sec1", simbolos_especiais_composto); insert_map("(*", "sec2", simbolos_especiais_composto); insert_map("*)", "sec3", simbolos_especiais_composto); } int is_caracter(char tmp){ return (tmp >= 'a' && tmp <= 'z'); } int is_numero(char tmp){ return (tmp >= '0' && tmp <= '9'); } void init_simbolos_especiais(){ simbolos_especiais = init_map(1031); insert_map(".", "se01", simbolos_especiais); insert_map(";", "se02", simbolos_especiais); insert_map(",", "se03", simbolos_especiais); insert_map("(", "se04", simbolos_especiais); insert_map(")", "se05", simbolos_especiais); insert_map(":", "se06", simbolos_especiais); insert_map("=", "se07", simbolos_especiais); insert_map("<", "se08", simbolos_especiais); insert_map(">", "se09", simbolos_especiais); insert_map("+", "se10", simbolos_especiais); insert_map("-", "se11", simbolos_especiais); insert_map("*", "se12", simbolos_especiais); } void init_all_map(){ init_simbolos_especiais(); init_simbolos_especiais_compostos(); init_simbolos_especiais_compostos_negrito(); simbolos_identificadores = init_map(1031); simbolos_numeros = init_map(1031); } void PROXIMO(FILE *fp){ if(is_EOF) return; if(proximo == '\n'){ if(linha != 0){ printf("\n"); fprintf(fout, "\n"); } linha++; printf("linha %d: ", linha); fprintf(fout, "linha %d: ", linha); } if(fscanf(fp, "%c", &proximo) == EOF){ is_EOF = 1; return ; } return ; } char* CODIGO(char *cod){ char *tmp; if((tmp = get_value(cod, simbolos_especiais)) != NULL){ return tmp; } if((tmp = get_value(cod, simbolos_especiais_composto)) != NULL){ return tmp; } if((tmp = get_value(cod, simbolos_especiais_composto_negrito)) != NULL){ return tmp; } if((tmp = get_value(cod, simbolos_numeros)) != NULL){ return tmp; } if((tmp = get_value(cod, simbolos_identificadores)) != NULL){ return tmp; } return NULL; } void ERRO(enum error_type error_code){ fprintf(stderr, "Erro na linha %d\n", linha); if(error_code == SIMBOLO_ESPECIAL_DESCONHECIDO){ fprintf(stderr, "ERRO: Simbolo especial desconhecido\n"); } else{ fprintf(stderr, "ERRO: Identificador ou numero mal formado\n"); } exit(1); }