/* * 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" #define EXT_ERR_PARAMS 1 extern string_map special_char; extern string_map simbolos_especiais; extern string_map simbolos_especiais_composto; extern string_map simbolos_especiais_composto_negrito; extern int is_EOF; extern FILE *fout; int main(int argc, char *argv[]){ if(argc != 2){ fprintf(stderr, "passe o nome do arquivo\n"); exit(EXT_ERR_PARAMS); } init_all_map(); char *file_path = argv[1]; //char *file_path = "asd.asd"; FILE *fp = fopen(file_path, "r"); if(fp == NULL){ fprintf(stderr, "Nao foi possivel abrir o arquivo\n"); exit(2); } fout = fopen("out.txt", "w"); if(fout == NULL){ fprintf(stderr, "Nao foi possivel abrir o arquivo de saida\n"); exit(3); } extern char proximo; char *simbolo; char atomo[4096]; PROXIMO(fp); while(is_EOF == 0){ /*while(proximo == ' ' || proximo == 9 || proximo == '\r'){ PROXIMO(fp); }*/ while((proximo == ' ' || proximo == 9 || proximo == '\r' || proximo == '\n') && is_EOF == 0){ //printf("\n"); //fprintf(fout, "\n"); PROXIMO(fp); } if(is_EOF) break; char tmp[2] = "\0";/* "\0\0" */ tmp[0] = proximo; if(get_value(tmp, simbolos_especiais) != NULL){ char s[3] = "\0"; s[0] = proximo; PROXIMO(fp); if(s[0] == ':' && proximo == '='){ s[1] = '='; PROXIMO(fp); } simbolo = CODIGO(s); }else if(is_caracter(proximo)){ int indice = 0; while(is_caracter(proximo) || is_numero(proximo)){ atomo[indice++] = proximo; PROXIMO(fp); } atomo[indice] = '\0'; // printf("atomo: %s\n", atomo); //se atomo pertence a palavra reservada if(get_value(atomo, simbolos_especiais_composto_negrito) != NULL || get_value(atomo, simbolos_identificadores) != NULL){ simbolo = CODIGO(atomo); }else{ /* criar codigo identificador */ char *ci = malloc(sizeof(char) * 256); ci[0] = 'i'; ci[1] = 'd'; int _i = 2; extern int identificador_num; int aux = identificador_num++; while(aux > 0){ int n = aux%10; aux /= 10; ci[_i++] = '0' + n; } ci[_i] = '\0'; simbolo = ci; // printf("atomo: %s\t ci: %s\n", atomo, ci); insert_map(atomo, ci, simbolos_identificadores); } }else if(is_numero(proximo)){ int indice = 0; while(is_numero(proximo)){ atomo[indice++] = proximo; PROXIMO(fp); } atomo[indice] = '\0'; if(is_caracter(proximo)){ ERRO(IDENTIFICAR_NUMERO_MAL_FORMADO); } char *tmpp; if((tmpp = get_value(atomo, simbolos_numeros)) != NULL){ simbolo = tmpp; }else{ char *ni = malloc(sizeof(char) * 128); ni[0] = 'n'; ni[1] = 'u'; ni[2] = 'm'; for(int i=0; i<=strlen(atomo); ++i){ ni[i+3] = atomo[i]; } simbolo = ni; insert_map(atomo, ni, simbolos_numeros); // printf("ni: %s\n", ni); } }else{ ERRO(SIMBOLO_ESPECIAL_DESCONHECIDO); } printf("%s ", simbolo); fprintf(fout, "%s ", simbolo); } // printf("nu: %s\n", get_value("123123", simbolos_numeros)); // printf("linha: %d\n", linha); fclose(fp); fclose(fout); return 0; }