diff options
author | leo <leo@azuminha.com> | 2024-04-16 21:18:24 -0300 |
---|---|---|
committer | leo <leo@azuminha.com> | 2024-04-16 21:18:24 -0300 |
commit | 4eba85d0bf620b2f488c2cbeee6a84b2e4bf9fbf (patch) | |
tree | e592a312338ddbc312ced0ec2ddc27c38ce171bf | |
parent | 6a564da0f9c510c0222b05ba5da18c6ef73e8030 (diff) |
AAAAAAAAAAAAAAAAAAAAAAAAAAAA
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | include/lexical.h | 34 | ||||
-rw-r--r-- | lexical.c | 120 | ||||
-rwxr-xr-x | main | bin | 20504 -> 30632 bytes | |||
-rw-r--r-- | main.c | 152 | ||||
-rw-r--r-- | txt.txt | 24 |
6 files changed, 301 insertions, 31 deletions
@@ -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 <stdio.h> + +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 <stdio.h> +#include <stdlib.h> +#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); +} Binary files differ@@ -2,37 +2,129 @@ #include <stdlib.h> #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; } @@ -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 |