From 4eba85d0bf620b2f488c2cbeee6a84b2e4bf9fbf Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 16 Apr 2024 21:18:24 -0300 Subject: AAAAAAAAAAAAAAAAAAAAAAAAAAAA --- Makefile | 2 +- include/lexical.h | 34 ++++++++++++ lexical.c | 120 ++++++++++++++++++++++++++++++++++++++++++ main | Bin 20504 -> 30632 bytes main.c | 152 +++++++++++++++++++++++++++++++++++++++++++----------- txt.txt | 24 +++++++++ 6 files changed, 301 insertions(+), 31 deletions(-) create mode 100644 include/lexical.h create mode 100644 lexical.c create mode 100644 txt.txt diff --git a/Makefile b/Makefile index 00a226d..6b3d8e8 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ all: - gcc -o main main.c map.c -g + gcc -o main main.c map.c lexical.c -g diff --git a/include/lexical.h b/include/lexical.h new file mode 100644 index 0000000..6898d6c --- /dev/null +++ b/include/lexical.h @@ -0,0 +1,34 @@ +#ifndef _MYLEX_H +#define _MYLEX_H + +#include "map.h" +#include + +extern string_map special_char; +extern string_map simbolos_especiais; +extern string_map simbolos_especiais_composto; +extern string_map simbolos_especiais_composto_negrito; + +extern string_map simbolos_identificadores; +extern string_map simbolos_numeros; + + +extern char proximo; +extern int linha; +extern int identificador_num; + +void init_special_char(); +void init_simbolos_especiais(); +void init_simbolos_especiais_compostos(); +void init_simbolos_especiais_compostos_negrito(); + +void init_all_map(); + +int is_caracter(char tmp); +int is_numero(char tmp); + +void PROXIMO(FILE *fp); +char* CODIGO(char *cod); +void ERRO(); + +#endif diff --git a/lexical.c b/lexical.c new file mode 100644 index 0000000..46ffffb --- /dev/null +++ b/lexical.c @@ -0,0 +1,120 @@ +#include +#include +#include "include/map.h" +#include "include/lexical.h" + +char proximo = '\n'; +int is_EOF = 0; +int linha = 1; // Numero da linha atual) +int identificador_num = 1; + +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(fscanf(fp, "%c", &proximo) == EOF){ + is_EOF = 1; + return ; + } + printf("%c", proximo); + if(proximo == '\n'){ + PROXIMO(fp); + linha++; + } + + 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(){ + fprintf(stderr, "Erro na linha %d\n", linha); + exit(1); +} diff --git a/main b/main index dee5d0e..6032534 100755 Binary files a/main and b/main differ diff --git a/main.c b/main.c index 0f0d650..e0663a4 100644 --- a/main.c +++ b/main.c @@ -2,37 +2,129 @@ #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; + int main(int argc, char *argv[]){ - string_map special_char = init_map(1024); - - insert_map("aa", "aa", special_char); - insert_map("d", "d", special_char); - - char *test = get_value("aa", special_char); - printf("%s\n", test); - test = get_value("d", special_char); - printf("%s\n", test); - test = get_value("d", special_char); - printf("%s\n", test); - test = get_value("aa", special_char); - printf("%s\n", test); - /* - if(argc != 2){ - fprintf(stderr, "passe o nome do arquivo\n"); - exit(EXT_ERR_PARAMS); - } - - char *file_path = argv[1]; - FILE *fp = fopen(file_path, "r"); - - char tmp; - while(fscanf(fp, "%c", &tmp) != EOF){ - printf("%c", tmp); - } - - fclose(fp); - */ - return 0; + /* + init_special_char(); + printf("%s\n", test); + init_simbolos_especiais(); + test = get_value("d", special_char); + printf("%s\n", test); + test = get_value("d", special_char); + printf("%s\n", test); + test = get_value("aa", special_char); + printf("%s\n", test); + */ + /* + if(argc != 2){ + fprintf(stderr, "passe o nome do arquivo\n"); + exit(EXT_ERR_PARAMS); + }*/ + init_all_map(); + + char *file_path = "txt.txt";//argv[1]; + FILE *fp = fopen(file_path, "r"); + + extern char proximo; + char *simbolo; + char atomo[4096]; + + PROXIMO(fp); + while(proximo == '\n'){ + PROXIMO(fp); + } + + char tmp[2] = "\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] = '='; + } + 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(); + } + + 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(); + } + +// printf("nu: %s\n", get_value("123123", simbolos_numeros)); + + +// printf("linha: %d\n", linha); + /*while(is_EOF != 1){ + PROXIMO(fp); + printf("%c", proximo); + }*/ + + fclose(fp); + + return 0; } diff --git a/txt.txt b/txt.txt new file mode 100644 index 0000000..afd934b --- /dev/null +++ b/txt.txt @@ -0,0 +1,24 @@ +program exemplo1 + var + n, s, i: integer; + procedure soma; + var q: integer; + begin + q:=i*i; + if (i div 2)*2 = i then + s:=s+q; + else + s:=s-q; + end; +begin + read(n); + s:=0; i:=0; + while i<=n do + begin + soma; + write (s); + i:=i+1; + end +end. + + \ No newline at end of file -- cgit v1.2.3