From d99455c19f1fd39ca920deec227216a8fe241c4d Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Sat, 26 Dec 2020 11:57:26 -0300 Subject: [PATCH 01/30] =?UTF-8?q?Corre=C3=A7=C3=A3o=20de=20bug=20do=20addP?= =?UTF-8?q?arams?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/textManager.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/textManager.c b/src/textManager.c index b75ce63..4b7fd92 100644 --- a/src/textManager.c +++ b/src/textManager.c @@ -11,7 +11,8 @@ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { //printf("\t[customCat] source: %s \n\n\n",src); while(*dest){ - //printf("\t[customCat] %s \n",dest); + //printf("\t[customCat] %s \n",dest); + //*dest = '\0'; dest++; // vai para a "proxima posição disponivel" (no caso de strings usadas anteriormente por essa função só roda "uma vez") } while(*src){ @@ -86,16 +87,16 @@ char *addParams(char *original, char *param, char* delim1, char* delim2) { char *newString; int breakline=0; int statementEnd = 0; - if(original[strlen(original)-1] == '\n'){ + int tamOriginal = strlen(original); + if(original[tamOriginal-1] == '\n'){ breakline = 1; } //printf("aaaa: %c \n",original[strlen(original)-2]); - if(original[strlen(original)-2]== ';'){ + if(original[tamOriginal-2]== ';'){ statementEnd = 1; } - - if(statementEnd || original[strlen(original)-1] == delim2[0] || original[strlen(original)-2] == delim2[0]){ - newString = (char*) malloc(sizeof(char)*(strlen(original)+2+strlen(param)+1)); // original + param + ',' + ' ' + '\0' + if(original[tamOriginal-3] == delim2[0] || original[tamOriginal-1] == delim2[0] || original[tamOriginal-2] == delim2[0]){ + newString = (char*) malloc(sizeof(char)*(strlen(original) +2+ strlen(param) +1)); // original + param + ',' + ' ' + '\0' newString = customCat(newString,original,delim2[0],0); //printf("caso 1... %s \n",newString); newString = customCat(newString,", ",0,0); @@ -107,8 +108,13 @@ char *addParams(char *original, char *param, char* delim1, char* delim2) { } else { //printf("%ld %ld \n",strlen(original),strlen(param)); - newString = (char*) malloc(sizeof(char)*(strlen(original)+1+strlen(param)+1+1)); // ( , ) e \0 - newString = customCat(newString,original,'\n',0); + newString = (char*) malloc(sizeof(char)*(strlen(original) + 1 + strlen(param) + 1 + 1)); // ( ) e \0 + if(statementEnd){ + newString = customCat(newString,original,';',0); + } + else{ + newString = customCat(newString,original,'\n',0); + } newString = customCat(newString,delim1,0,0); newString = customCat(newString,param,0,0); newString = customCat(newString,delim2,0,0); @@ -120,7 +126,7 @@ char *addParams(char *original, char *param, char* delim1, char* delim2) { if(breakline){ newString = customCat(newString,"\n",0,0); } - newString = newString - ((strlen(original)+strlen(param)+2)-1); + newString = newString - ((strlen(original)+strlen(param)+2)-breakline); return newString; } From 8c90365df345b2c0cb4d24d22805221f2817e649 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Sat, 26 Dec 2020 11:58:32 -0300 Subject: [PATCH 02/30] =?UTF-8?q?Reformula=C3=A7=C3=A3o=20do=20pr=C3=A9=20?= =?UTF-8?q?processamento=20para=20renomear=20dependencias=20(#32,#44,#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- headers/HeaderSmv.h | 90 ++++++++++++++++--- headers/PreProcess.h | 45 ++++++---- headers/STable.h | 1 + src/Interpreter.c | 11 +-- src/PostProcess.c | 10 ++- src/PreProcess.c | 160 +++++++++++++++------------------ src/datastructures/HeaderSmv.c | 138 +++++++++++++++++++++++----- src/datastructures/STable.c | 19 +--- src/langmodules/Object.c | 15 +--- src/main.c | 41 ++++----- 10 files changed, 332 insertions(+), 198 deletions(-) diff --git a/headers/HeaderSmv.h b/headers/HeaderSmv.h index a855fc2..41c523b 100644 --- a/headers/HeaderSmv.h +++ b/headers/HeaderSmv.h @@ -2,11 +2,15 @@ #define HEADER_H -enum headerPart {CREATE_MODULE = -1, VAR = 0, ASSIGN = 1, TRANS = 2}; +#include +#include "textManager.h" +#include "Enum.h" + +typedef enum headerpart {CREATE_MODULE = -1, VAR = 0, ASSIGN = 1, TRANS = 2} headerpart; typedef struct headersmv { - int type; + smvtype type; char* moduleName; char** varBuffer; // poderia transormar em uma tabela hash(facilidade em achar a variavel, mas acredito que uma vez escrito aqui não vai ter alteração!) char** transBuffer; // vai ser inalterado durante a execução (só no pré processamento, ou seja já é criado preeenchido) @@ -14,6 +18,7 @@ typedef struct headersmv int VAR_POINTER; int TRANS_POINTER; int ASSIGN_POINTER; + int VAR_RENAME_POINTER; //char** declaredPorts; // usar para impedir o usuário de se "sabotar" usando ports que não existem }HeaderSmv; @@ -22,33 +27,92 @@ HeaderSmv* createHeader(int type, char* moduleName, int varP, int assignP, int t void letgoHeader(HeaderSmv* h); - -/*Controlador de Header(auxiliar)*/ -HeaderSmv** initHeadersStruct(int size); - -void letGoHeadersStruct(HeaderSmv** hs, int size); - - typedef struct headerController { - HeaderSmv ** headers; + HeaderSmv** MAIN_RELATED; + HeaderSmv** AUTOMATA_RELATED; + HeaderSmv** PORTS_RELATED; + int H_MAIN_CURRENT_SIZE; + int H_AUTOMATA_CURRENT_SIZE; + int H_PORTS_CURRENT_SIZE; int declaredPorts; - int CURRENT_SIZE; // usar current size com -1 (se vc está processando o indice atual(ultimo) é porque ele já alocou para o seguinte!) + STable* mainInfo; + STable* portsInfo; + //int CURRENT_SIZE; // usar current size com -1 (se vc está processando o indice atual(ultimo) é porque ele já alocou para o seguinte!) // ex: sétimo membro(6) (CURRENT_SIZE = 7) (ou seja para referenciar o último é só pegar CURRENT-1) }HeaderController; -HeaderController* createController(int size); +HeaderController *createController(); + + +/** + * Libera o controlador e todas as estruturas armazenadas por ele + * @SidEffects: Chama o liberar dos headers e tabelas de simbolos + * */ +void letGoHeadersStruct(HeaderController *H); void letGoHeaderControl(HeaderController* Hcontrol); -/*Controlador de Header(auxiliar)*/ +/** + * Printa cada componente: VAR, ASSIGN, TRANS de um módulo SMV + * */ void printHeaderBuffer(HeaderSmv* h, int type, char* typeString); +/** + * Printa o módulo SMV e suas componentes: VAR, ASSIGN, TRANS + * */ void printHeader(HeaderSmv* h); +/** + * Printa todas os headers armazenados pelo controlador + * */ +void printAllHeaders(HeaderController* Hcontrol); + void writeHeaderBuffer(HeaderSmv* h, int part, FILE* smvoutput); void writeHeader(HeaderSmv* header, FILE* smvoutput); +/** + * Considerando a refatoração do controller e header, encapsulamos o header apropriado pela estrutura, e esse deve + * ser recuperado usando o enum de smvtype e o indice. + * + * Caso o indice não seja informado o último header salvo (tanto do agrupamento main, automato, ou ports) é retornado + * Esse comportamento é usado pelo pré processamento, considerando que cada agrupamento é consultado para verificar o + * progresso de algumas alterações (ex: trocar FROZENVAR de portsModule), e otimizações da leitura + * + * @param controller o controlador de headers + * @param cat o tipo smv de parte de intesse (main, automato/modulo generico, ports) + * @param indexOfHeader a ordem de headers de cada parte de interesse (ex: 0 = portsModule, 1: função1 associada a tds) + * + * @returns o header apropriado com a parte de interesse do arquivo SMV + * */ +HeaderSmv* accessHeader(HeaderController* controller, smvtype cat, int indexOfHeader); + +/** + * Considerando a refatoração do controller e header, encapsulamos as tabelas de simbolo auxiliares (SMV_INFO) + * ser recuperado usando o enum de smvtype. + * + * @param controller o controlador de headers + * @param cat o tipo smv de parte de intesse (main, automato/modulo generico, ports) + * + * @returns a tabela de simbolos SMV_INFO apropriada + * */ +STable* accessSmvInfo(HeaderController* controller, smvtype cat); + +/** + * Adiciona um novo header ao controller encapsulando suas operações e categorizando apropriadamente + * @param o controller + * @param o novo header retornado por createHeader + */ +void addNewHeader(HeaderController* controller, HeaderSmv* newHeader); + +/** + * Adiciona um novo parâmetro a portModule, e resolve as depêndencias nos demais módulos main e automato. + * @param o controller + * @param o novo parâmetro + * @SideEffects: Para cada módulo (main, automato ...) é atualizada a linha com depdência a ports e essa operação chama + * o módulo textManager e seus método addParams, criando uma string nova e liberando a antiga + */ +void addParamToPortsModule(HeaderController *controller, char *param, int first); #endif diff --git a/headers/PreProcess.h b/headers/PreProcess.h index c3c9a3a..71ed2dd 100644 --- a/headers/PreProcess.h +++ b/headers/PreProcess.h @@ -3,9 +3,6 @@ #define PREP_H #include "HeaderSmv.h" -#include "STable.h" - - /* @@ -15,7 +12,7 @@ * cria um header (necessita de free depois) */ -void initPreProcessHeader(int type, char* moduleName, HeaderController* Hcontrol); +void initPreProcessHeader(smvtype type, char* moduleName, HeaderController* Hcontrol); @@ -26,7 +23,7 @@ void initPreProcessHeader(int type, char* moduleName, HeaderController* Hcontrol * ao ter controlRename como true, ele remove todas as ocorrências de determinados caracteres (no caso []) */ -void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable); +void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRename, int currentHeader, STable *writeSmvTypeTable); @@ -35,7 +32,8 @@ void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, in ratando a posição (pos) que representa o tamanho do vetor de HEADERS do controller (LEN-1) */ -void saveLineOnBuffer(int pos,int part, char* line, HeaderController* Hcontrol, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable); +void saveLineOnBuffer(smvtype currentHeader, headerpart part, char *line, HeaderController *Hcontrol, int controlRename, + STable *writeSmvTypeTable); @@ -43,16 +41,31 @@ void saveLineOnBuffer(int pos,int part, char* line, HeaderController* Hcontrol, as partes de interesse servem como delimitadores, quebras de linha servem como delimitadores dos módulos stages são os módulos 0(main), automato(2), ports(3) */ -void processPhase(int stage, int part, HeaderController* Hcontrol, char * line, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable); - - -void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvTypeTable); - -/* - configura a tabela de controle de escrita para a diretiva temporal do Header Main - inicializando com a variável time (que não possui typeset, por so poder ser X..Y) -*/ -void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, STable* global); +void processPhase(smvtype stage, headerpart part, HeaderController *Hcontrol, char *line, int controlRename, + STable *writeSmvTypeTable); +/** + * Salva o arquivo SMV original em headers, separados por categorias e partes de um arquivo SMV. + * Durante esse pré processamento, são usadas variáveis strings auxiliares para reconhecer pontos de interesse no arquivo. + * A cada ponto de interesse identificado, um buffer do header é escolhido, e esse atualizado. + * Ao se identificar o alguma referência a portsModule essa tem o parâmetro time adicionado, e uma referência é salva no header do automato, + * para renomações futuras. Além disso são criadas entradas na tabelas de simbolos auxiliares (SMV_INFO) usadas pelo main e ports, respectivamente, + * a variável time e as portas que vierem do módulo original. + * */ +void preProcessSmv(FILE *smvP, HeaderController *Hcontrol); + + +/** + * Configura a tabela de controle SMV info da main para a variável time a incializando + * com uma tupla de inteiros (que não possui typeset, por so poder ser X..Y). Além disso, + * inicializa as diretivas temporais no escopo global (main). + * + * @param Hcontrol o controller de headers e informações SMV + * @param global a tabela de simbolos global do "programa" .tds + * + * @SideEffects: Chama o addValue da tabela de simbolos para os casos citados, alocando memória para as Entry de + * cada tupla. + * */ +void setUpMainSmvTable(HeaderController *Hcontrol, STable *global); #endif diff --git a/headers/STable.h b/headers/STable.h index 232bf8b..8158137 100644 --- a/headers/STable.h +++ b/headers/STable.h @@ -6,6 +6,7 @@ #include "Object.h" #define MAX_TABLE 950 +#define MAX_SIMPLE 100 #define MAX_CHILD 150 diff --git a/src/Interpreter.c b/src/Interpreter.c index 91c39fb..316f5df 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -592,7 +592,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, void* vp[] = {ptitime}; updateValue("I_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",I_TIME); - updateTime(controllerSmv->headers[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,0,0); + updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,0,0); // necessita atualizar C_TIME updateValue("C_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); } @@ -600,7 +600,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, void* vp[] = {ptftime}; updateValue("F_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",F_TIME); - updateTime(controllerSmv->headers[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,1,1); + updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,1,1); } return NULL; } @@ -671,9 +671,10 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea int new = *(int*)expr->values[0]; minmax = new > old; } - STable* refAuxTable = writeSmvTypeTable[scope->type == FUNC && expr->type == TDS_ENTRY? controllerSmv->CURRENT_SIZE-1 : 0 ]; - // ports ou main - HeaderSmv* refHeader = controllerSmv->headers[scope->type == FUNC && expr->type == TDS_ENTRY? controllerSmv->CURRENT_SIZE-1 : 0 ]; + // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) + STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); + HeaderSmv* refHeader = accessHeader(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN ,scope->order); + TableEntry* itimeEntry = lookup(scope,"I_TIME"); int itime = *(int*)itimeEntry->val->values[0]; int changeContext = ctime > itime; // verifica se mudou o contexto diff --git a/src/PostProcess.c b/src/PostProcess.c index 1437f4e..ed44d60 100644 --- a/src/PostProcess.c +++ b/src/PostProcess.c @@ -410,8 +410,14 @@ void writeResultantHeaders(HeaderController* controller, const char* path){ int i; FILE* smvoutput = fopen(path, "w"); - for(i = 0; i< controller->CURRENT_SIZE; i++){ - writeHeader(controller->headers[i],smvoutput); + for(i = 0; i< controller->H_MAIN_CURRENT_SIZE; i++){ + writeHeader(controller->MAIN_RELATED[i],smvoutput); + } + for(i = 0; i< controller->H_AUTOMATA_CURRENT_SIZE; i++){ + writeHeader(controller->AUTOMATA_RELATED[i],smvoutput); + } + for(i = 0; i< controller->H_PORTS_CURRENT_SIZE; i++){ + writeHeader(controller->PORTS_RELATED[i],smvoutput); } fclose(smvoutput); diff --git a/src/PreProcess.c b/src/PreProcess.c index 4b2f57b..c6ec5fc 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -1,7 +1,6 @@ #include #include #include -#include "../headers/textManager.h" #include "../headers/PreProcess.h" @@ -12,10 +11,10 @@ * cria um header (necessita de free depois) */ -void initPreProcessHeader(int type, char* moduleName, HeaderController* Hcontrol) { +void initPreProcessHeader(smvtype type, char* moduleName, HeaderController* Hcontrol) { int transP = type == AUTOMATA? 0 : -1; - Hcontrol->headers[Hcontrol->CURRENT_SIZE] = createHeader(type, moduleName, 0, 0, transP); - Hcontrol->CURRENT_SIZE += 1; + HeaderSmv* newHeader = createHeader(type, moduleName, 0, 0, transP); + addNewHeader(Hcontrol,newHeader); } /* @@ -24,7 +23,7 @@ void initPreProcessHeader(int type, char* moduleName, HeaderController* Hcontrol * ao ter controlRename como true, ele remove todas as ocorrências de determinados caracteres (no caso []) */ -void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable) { +void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRename, int currentHeader, STable *writeSmvTypeTable) { int pt; int tam = strlen(line); char* aloc = malloc((tam+1) * sizeof(char)); @@ -36,7 +35,14 @@ void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, in pt = header->VAR_POINTER; header->varBuffer[pt] = aloc; - if(readVarsPortsModule) + if(currentHeader == MAIN && strstr(line,"(time)")) { + header->VAR_RENAME_POINTER = pt; + } + if(currentHeader == AUTOMATA && line[0] == '\t' && line[1] == 'p'){ + header->VAR_RENAME_POINTER = pt; + } + + if(currentHeader == PORTS && (line[0] == '\t' || strstr(line,":"))) { printf("[saveLineOnBuffer] Salvando tabela de portas (%s) \n\n",line); printf("[saveLineOnBuffer] Salvando tabela de portas (%c) \n\n",line[1]); @@ -45,9 +51,8 @@ void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, in char name[] = {line[1],'\0'}; //addValue(name,po,TYPE_SET,2,0,portsSmv); - addTypeSetSmv(name, po, TYPE_SET, 2, writeSmvTypeTable[1]); + addTypeSetSmv(name, po, TYPE_SET, 2, writeSmvTypeTable); } - header->VAR_POINTER += 1; } if(part == ASSIGN) @@ -78,7 +83,6 @@ void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, in //} } header->TRANS_POINTER += 1; - } } @@ -87,15 +91,16 @@ void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, in ratando a posição (pos) que representa o tamanho do vetor de HEADERS do controller (LEN-1) */ -void saveLineOnBuffer(int pos,int part, char* line, HeaderController* Hcontrol, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable) { - selectBuffer(part,line,Hcontrol->headers[pos-1],controlRename,readVarsPortsModule,writeSmvTypeTable); +void saveLineOnBuffer(smvtype currentHeader, headerpart part, char *line, HeaderController *Hcontrol, int controlRename, STable *writeSmvTypeTable) { + HeaderSmv* current = accessHeader(Hcontrol,currentHeader,-1); + selectBuffer(part, line, current, controlRename, currentHeader, writeSmvTypeTable); } /* fases: criação, var, assign(pode não existir), trans(pode não existir) (as partes de interesse) as partes de interesse servem como delimitadores, quebras de linha servem como delimitadores dos módulos stages são os módulos 0(main), automato(2), ports(3) */ -void processPhase(int stage, int part, HeaderController* Hcontrol, char * line, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable) { +void processPhase(smvtype stage, headerpart part, HeaderController *Hcontrol, char *line, int controlRename, STable *writeSmvTypeTable) { // modulo if(part == CREATE_MODULE) { @@ -104,37 +109,35 @@ void processPhase(int stage, int part, HeaderController* Hcontrol, char * line, } // VAR, ASSIGN, TRANS else{ - saveLineOnBuffer(Hcontrol->CURRENT_SIZE,part,line,Hcontrol,controlRename,readVarsPortsModule, writeSmvTypeTable); + saveLineOnBuffer(stage, part, line, Hcontrol, controlRename, writeSmvTypeTable); } } -void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, STable* global) +void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) { // seta alguns pontos de interesse da diretiva temporal char nome[] = "time"; char* auxDelim; char* auxFim; - char* linhaLida = Hcontrol->headers[0]->varBuffer[1]; + char* linhaLida = Hcontrol->MAIN_RELATED[0]->varBuffer[1]; int pos = 1; int pointIni; int pointEnd; int tam = strlen(linhaLida); auxDelim = strstr(linhaLida,":"); - auxFim = strstr(auxDelim,".."); - pointIni = (auxDelim-linhaLida+2); pointEnd = ((auxFim-linhaLida))-1; void* po[] = {&pos, &tam, &pointIni, &pointEnd}; - addValue(nome, po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable[0], 0); + addValue(nome, po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); // remover depois? (assim como a gente deve fazer o no pré processamento o "loop do time") - char* linhaLidaInit = Hcontrol->headers[0]->assignBuffer[1]; + char* linhaLidaInit = Hcontrol->MAIN_RELATED[0]->assignBuffer[1]; pos = 1; tam = strlen(linhaLidaInit); @@ -143,10 +146,10 @@ void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, S pointIni = auxDelim - linhaLidaInit+2; // pointEnd = auxFim - linhaLidaInit-1; // entra no intervalo de sobrescrita - addValue("init(time)", po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable[0], 0); + addValue("init(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); - char* linhaLidaNext = Hcontrol->headers[0]->assignBuffer[3]; + char* linhaLidaNext = Hcontrol->MAIN_RELATED[0]->assignBuffer[3]; pos = 3; // note que a posição de inicio de leitura do next é irrelevante pela formatação do case tam = strlen(linhaLidaNext); @@ -155,7 +158,7 @@ void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, S pointIni = auxDelim - linhaLidaNext+2; pointEnd = auxFim - linhaLidaNext-1; - addValue("next(time)", po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable[0], 0); + addValue("next(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); // ele salva: time = 6 : 0; (reboot) ou time < 3: time + 1; (incremento até F_TIME) @@ -171,7 +174,7 @@ void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, S } -void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvTypeTable) { +void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { /*Strings que são usadas para a busca no arquivo*/ char varString[] = "VAR \n"; @@ -180,31 +183,31 @@ void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvType char fVarString[] = "FROZENVAR"; char portsModuleString[] = "MODULE portsModule"; char automataString[] = "MODULE finalAutomata(time)"; - char beginModuleString[] = "MODULE "; - - char confirmAutomataString[] = "cs: {"; // se não encontrar isso após "começar a ler um automato" quer dizer que era um módulo qualquer - // ATUALIZAR: usar string "caracteristica" para detectar módulos de "função" (transform) - + char beginModuleString[] = "MODULE "; + // se não encontrar isso após "começar a ler um automato" quer dizer que era um módulo qualquer + char confirmAutomataString[] = "cs: {"; + // ATUALIZAR: usar string "caracteristica" para detectar módulos de "função" (transform) /*Parâmetro a ser adicionado a PortsModule */ char timeString[] = "time"; /*Variáveis de controle de cursor e buffer - -> propriedades do buffer e buffer auxiliar + -> buffer + -> propriedades do buffer + -> ponteiro auxiliar */ - char* buffer; char* bufferAux; size_t bufsize = 300; buffer = (char *) malloc(bufsize * sizeof(char)); //bufferAux = (char *) malloc(bufsize * sizeof(char)); - /*Variáveis de controle de "onde no arquivo estamos" - -> estamos em qual "estagio" de interesse (1 = MAIN, 2 = Módulos(automato e funcoes), 3 = Ports) + /*Variáveis de controle de leitura + -> estamos em qual "estagio" de interesse (1 = MAIN, 2 = Módulos(automato e outros), 3 = Ports) -> indice baseado no estagio corrente -> em qual fase dos estágios estamos (-1 = lendo inicio do módulo, 0 =var , 1 = ASSIGN, 2= TRANS ) (note que assign e trans podem não existir ) -> estamos lendo um ASSIGN - -> estamos lendo a relação de transição do automato + -> estamos lendo TRANS (relação de transição do automato) -> deve-se renomear referencias a portsModule -> estamos lendo automato -> estamos lendo portsModule @@ -218,20 +221,15 @@ void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvType int controlRename = 0; int readAutomata = 0; int readPortsModule = 0; - int afterVarParPorts = 0; - int readVarsPortsModule = 0; int renamePortsParam = 0; while ((fgets(buffer,bufsize,smvP))) { bufferAux = buffer; - // ajuda a não rodar na primeira passada (do main) if(stage != MAIN && !readPortsModule && !readAutomata){ if(strstr(buffer,portsModuleString)) { stage = PORTS; - bufferAux = addParams(buffer, timeString, "(", ")"); - renamePortsParam = 1; readPortsModule = 1; } else{ @@ -239,8 +237,7 @@ void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvType readAutomata = 1; } } - - + // estamos ainda no meio do módulo if(buffer[0] != '\n') { if(phase == TRANS) @@ -257,25 +254,49 @@ void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvType { //printf("[preProcessSmv] Buffer pré computePhase 2 %s \n\n",buffer); readTrans = (buffer[0] == 'T' && strstr(buffer,transString)); - // na verdade entramos na fase de leitura de transições que veio LOGO DEPOIS DE ATRIBUIÇÕES if(readTrans) { //printf("[preProcessSmv] terminou ASSIGN \n\n"); phase = TRANS; // mudou de fase } - } else { break; // não precisa mais ler(vai ser lido da arvore) } - - } - + + // usa a primeira letra de cada parte de interesse primeiro para realizar curto circuito + if(phase == VAR) + { + //printf("[preProcessSmv] Buffer pré computePhase1 %s \n\n",buffer); + readAssign = (buffer[0] == 'A' && strstr(buffer,assignString)); + readTrans = (buffer[0] == 'T' && strstr(buffer,transString)); + + if(!(readAssign || readTrans)) + { + int iniVar = accessHeader(Hcontrol, stage, -1)->VAR_POINTER == 0; + if(readPortsModule && iniVar && strstr(buffer,fVarString)) { + //printf("[preProcessSmv] Trocou FVAR %s\n",buffer); + bufferAux = varString; // tratamento de FROZEN VAR + } + } + else + { + //printf("[preProcessSmv] terminou VAR \n\n"); + phase = readAssign ? ASSIGN : TRANS; + readAssign = 0; + } + + } + processPhase(stage, phase, Hcontrol, bufferAux, controlRename, accessSmvInfo(Hcontrol,stage)); + if(phase == CREATE_MODULE){ + phase++; + } + } - // módulos são separados por quebra de linha + // proximo modulo (módulos são separados por quebra de linha) else { // reinicio @@ -283,52 +304,11 @@ void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvType stage++; readAutomata = 0; //printf("[preProcessSmv] módulo acabou \n\n"); - continue; } - - // usa a primeira letra de cada parte de interesse primeiro para realizar curto circuito - if(phase == VAR) - { - //printf("[preProcessSmv] Buffer pré computePhase1 %s \n\n",buffer); - readAssign = (buffer[0] == 'A' && strstr(buffer,assignString)); - readTrans = (buffer[0] == 'T' && strstr(buffer,transString)); - - if(!(readAssign || readTrans)) - { - int iniVar = Hcontrol->headers[Hcontrol->CURRENT_SIZE-1]->VAR_POINTER == 0; - if(readPortsModule && iniVar && strstr(buffer,fVarString)) { - //printf("[preProcessSmv] Trocou FVAR %s\n",buffer); - bufferAux = varString; // tratamento de FROZEN VAR - afterVarParPorts = 1; - } - } - else - { - //printf("[preProcessSmv] terminou VAR \n\n"); - phase = readAssign ? ASSIGN : TRANS; - readAssign = 0; - } - - } - - processPhase(stage,phase,Hcontrol,bufferAux,controlRename,readVarsPortsModule,writeSmvTypeTable); - - if(phase == CREATE_MODULE){ - phase++; - } - - - if(afterVarParPorts) - { - readVarsPortsModule = 1; - } - - if(renamePortsParam && phase == PORTS){ - free(bufferAux); - renamePortsParam = 0; - } + //printf("%l\n",Hcontrol->) } free(buffer); - //printf("terminou! \n"); + //printf("terminou! \n"); + addParamToPortsModule(Hcontrol, "time", 1); } \ No newline at end of file diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index b202c95..fbbfd99 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -2,7 +2,6 @@ #include #include #include "../../headers/HeaderSmv.h" -#include "../../headers/Enum.h" HeaderSmv* createHeader(int type, char* moduleName, int varP, int assignP, int transP) { @@ -27,6 +26,7 @@ HeaderSmv* createHeader(int type, char* moduleName, int varP, int assignP, int t } else{ header->transBuffer = NULL; + header->VAR_RENAME_POINTER = -1; } return header; @@ -77,27 +77,42 @@ void letgoHeader(HeaderSmv* h){ free(h); } - -HeaderSmv** initHeadersStruct(int size) { - - HeaderSmv** headers = ( HeaderSmv**) malloc(sizeof(HeaderSmv*)*size); - return headers; +void letGoRelatedHeaders(HeaderSmv** RHeader, int size){ + int i; + if(RHeader){ + for(i = 0; i< size; i++){ + letgoHeader(RHeader[i]); + RHeader[i] = NULL; + } + } } -void letGoHeadersStruct(HeaderSmv** hs, int size){ - - int i; - for(i = 0; i< size; i++){ - letgoHeader(hs[i]); - hs[i] = NULL; - } - free(hs); +void letGoHeadersStruct(HeaderController *H) { + + letGoRelatedHeaders(H->MAIN_RELATED, H->H_MAIN_CURRENT_SIZE); + letGoRelatedHeaders(H->AUTOMATA_RELATED, H->H_AUTOMATA_CURRENT_SIZE); + letGoRelatedHeaders(H->PORTS_RELATED, H->H_PORTS_CURRENT_SIZE); + + letgoTable(H->mainInfo); + letgoTable(H->portsInfo); + free(H); } -HeaderController* createController(int size) { - HeaderController* Hcontrol = malloc(sizeof(HeaderController)); - Hcontrol->CURRENT_SIZE = 0; - Hcontrol->headers = initHeadersStruct(size); +HeaderController *createController() { + + int DEFAULT_HEADERS_SIZE = 5; + + HeaderController* Hcontrol = malloc(sizeof(HeaderController)); + Hcontrol->H_MAIN_CURRENT_SIZE = 0; + Hcontrol->H_AUTOMATA_CURRENT_SIZE = 0; + Hcontrol->H_PORTS_CURRENT_SIZE = 0; + + Hcontrol->mainInfo = createTable(SMV_V_MAIN,NULL,0,0); + Hcontrol->portsInfo = createTable(SMV_PORTS,NULL,0,0); + + Hcontrol->MAIN_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); + Hcontrol->AUTOMATA_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); + Hcontrol->PORTS_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE);; Hcontrol->declaredPorts=0; return Hcontrol; @@ -105,8 +120,20 @@ HeaderController* createController(int size) { void letGoHeaderControl(HeaderController* Hcontrol) { - letGoHeadersStruct(Hcontrol->headers,Hcontrol->CURRENT_SIZE); - free(Hcontrol); + letGoHeadersStruct(Hcontrol); +} + +void printAllHeaders(HeaderController* Hcontrol){ + int i; + for (i = 0; i < Hcontrol->H_MAIN_CURRENT_SIZE; i++){ + printHeader(Hcontrol->MAIN_RELATED[i]); + } + for (i = 0; i < Hcontrol->H_AUTOMATA_CURRENT_SIZE; i++){ + printHeader(Hcontrol->AUTOMATA_RELATED[i]); + } + for (i = 0; i < Hcontrol->H_PORTS_CURRENT_SIZE; i++){ + printHeader(Hcontrol->PORTS_RELATED[i]); + } } @@ -209,5 +236,76 @@ void writeHeader(HeaderSmv* header, FILE* smvoutput){ fprintf(smvoutput,"%s","\n"); } +HeaderSmv* accessHeader(HeaderController* controller, smvtype cat, int indexOfHeader){ + HeaderSmv* toReturn = NULL; + if(cat == MAIN){ + toReturn = indexOfHeader != -1? controller->MAIN_RELATED[indexOfHeader] : controller->MAIN_RELATED[controller->H_MAIN_CURRENT_SIZE-1]; + } + if(cat == AUTOMATA){ + toReturn = indexOfHeader != -1? controller->AUTOMATA_RELATED[indexOfHeader] : controller->AUTOMATA_RELATED[controller->H_AUTOMATA_CURRENT_SIZE-1]; + } + if(cat == PORTS){ + toReturn = indexOfHeader != -1? controller->PORTS_RELATED[indexOfHeader] : controller->PORTS_RELATED[controller->H_PORTS_CURRENT_SIZE-1]; + } + if(!toReturn){ + fprintf(stderr, "[accessHeader] INVALID SMV TYPE FOR OPERATION"); + exit(-1); + } + return toReturn; + +} + +STable* accessSmvInfo(HeaderController* controller, smvtype cat){ + if(cat == MAIN){ + return controller->mainInfo; + } + if(cat == PORTS){ + return controller->portsInfo; + } + if(cat == AUTOMATA){ + return NULL; // melhorar, apesar que sabe-se que não tem operação em tabela de simbolos para automato (por enquanto) + } + fprintf(stderr, "[accessSmvInfo] INVALID SMV TYPE FOR OPERATION"); + exit(-1); +} + +void addNewHeader(HeaderController* controller, HeaderSmv* newHeader){ + if(newHeader->type == MAIN){ + controller->MAIN_RELATED[controller->H_MAIN_CURRENT_SIZE] = newHeader; + controller->H_MAIN_CURRENT_SIZE++; + } + if(newHeader->type == AUTOMATA){ + controller->AUTOMATA_RELATED[controller->H_AUTOMATA_CURRENT_SIZE] = newHeader; + controller->H_AUTOMATA_CURRENT_SIZE++; + } + if(newHeader->type == PORTS){ + controller->PORTS_RELATED[controller->H_PORTS_CURRENT_SIZE] = newHeader; + controller->H_PORTS_CURRENT_SIZE++; + } +} + +void propagParamDependence(HeaderSmv** headers, char* param, int sizeHeaders){ + int i; + char* refOldPt; + for(i = 0; i < sizeHeaders; i++){ + refOldPt = headers[i]->varBuffer[headers[i]->VAR_RENAME_POINTER]; + char* newDeclaration = addParams(refOldPt,param,"(",")"); + free(refOldPt); + headers[i]->varBuffer[headers[i]->VAR_RENAME_POINTER] = newDeclaration; + } +} + +void addParamToPortsModule(HeaderController *controller, char *param, int first) { + HeaderSmv* updated = accessHeader(controller,PORTS,0); + char* newName = addParams(updated->moduleName,param,"(",")"); + free(updated->moduleName); + updated->moduleName = newName; + // agora deve propagar as alterações para todos os demais módulos + if(!first){ + propagParamDependence(controller->MAIN_RELATED,param,controller->H_MAIN_CURRENT_SIZE); + } + propagParamDependence(controller->AUTOMATA_RELATED,param,controller->H_AUTOMATA_CURRENT_SIZE); +} + diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index 94cfe9a..6e51741 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -103,7 +103,7 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { newtable->backup = 0; newtable->collision = 0; newtable->conditionBind == NULL; - + newtable->children = NULL; newtable->parent = parent; /* @@ -112,19 +112,7 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { } */ - int selectSize = type == SIMPLE_HASH ? 15 : MAX_TABLE; - -/* - if(type == SIMPLE_HASH) - { - printf("[createTable] criando simple hash \n\n"); - } - else - { - printf("[createTable] criando escopo \n\n"); - } -*/ - + int selectSize = type == SIMPLE_HASH ? MAX_SIMPLE : MAX_TABLE; newtable->tableData = (TableEntry**) malloc(selectSize*sizeof(TableEntry*)); @@ -201,7 +189,8 @@ void letgoTable(STable *t) free(t->children); } if(t->tableData){ - for(i=0; i < MAX_TABLE; i++) + int size = t->type == SIMPLE_HASH ? MAX_SIMPLE : MAX_TABLE; + for(i=0; i < size; i++) { if(t->tableData[i]) { letgoEntry(t->tableData[i]); diff --git a/src/langmodules/Object.c b/src/langmodules/Object.c index a72a1eb..af91dfb 100644 --- a/src/langmodules/Object.c +++ b/src/langmodules/Object.c @@ -205,21 +205,14 @@ void letgoObject(Object* o, int always) int i; for (i = 0; i < o->OBJECT_SIZE; i++) { - if(o->type == TYPE_SET) - { - if(i < 2) - { - free(o->values[i]); // usar o free da tabela de simbolos para i == 3 (em outra localidade anteriormente) - } - } + if(o->type != TYPE_SET || i < 2) + { + free(o->values[i]); // usar o free da tabela de simbolos na chamada anterior + } else if(o->type == TDS_ENTRY) { // TODO PARA TDS } - else - { - free(o->values[i]); - } } } } diff --git a/src/main.c b/src/main.c index 08c4809..277ed0c 100644 --- a/src/main.c +++ b/src/main.c @@ -40,23 +40,19 @@ int main(int argc, char* argv[]) { fclose(fp); // tabelas e componentes globais - HeaderController* controller = createController(5); - + HeaderController* controller = createController(); STable* global = createTable(GLOBAL,NULL,0,0); - STable* mainVarsTypeSmv = createTable(SMV_V_MAIN,NULL,0,0); - STable* portsTypeSmv = createTable(SMV_PORTS,NULL,0,0); - STable* writeSmvTypeTable[] = {mainVarsTypeSmv,portsTypeSmv}; //pré processamento - preProcessSmv(smvP,controller,writeSmvTypeTable); - setUpMainSmvTable(controller,writeSmvTypeTable,global); + preProcessSmv(smvP, controller); +// setUpMainSmvTable(controller, NULL); printf("--------------------------------- EVAL ---------------------------------------------\n"); printf("\n"); printf("\n"); //pos processamento - eval(root,global,writeSmvTypeTable,controller); + //eval(root,global,writeSmvTypeTable,controller); printf("\n"); printf("------------------------------------------------------------------------------\n"); @@ -66,17 +62,17 @@ int main(int argc, char* argv[]) { printf("\n"); printf("\n"); - printf("--------------------------------- TABLES ---------------------------------------------\n"); + printf("--------------------------------- PROGRAM TABLES ---------------------------------------------\n"); printTable(global); printf("\n"); - printTable(writeSmvTypeTable[0]); - printf("\n"); - printTable(writeSmvTypeTable[1]); - printf("\n"); - + printf("--------------------------------- smv-INFO TABLES ---------------------------------------------\n"); + printTable(controller->mainInfo); + printf("\n"); + printTable(controller->portsInfo); + printf("\n"); printf("\n"); printf("\n"); @@ -85,18 +81,12 @@ int main(int argc, char* argv[]) { printf("--------------------------------- HEADERS ---------------------------------------------\n"); - - //printHeader(controller->headers[0]); - //printHeader(controller->headers[1]); - //printHeader(controller->headers[2]); - //printHeader(controller->headers[3]); -// printHeader(controller->headers[4]); + printAllHeaders(controller); if(!controller->declaredPorts){ fprintf(stderr, "[WARNING] THE MODEL GENERATION WAS SUCCESSFUL, HOWEVER NO TDS DEFINITION WAS FOUND \n IT IS RECOMENDED THAT YOU REVIEW YOUR .tds FILE \n"); } - writeResultantHeaders(controller,"results/newSmvfile.smv"); @@ -108,12 +98,11 @@ int main(int argc, char* argv[]) { // printf("teste TYPE SET !!! \n\n\n"); -// char* temp = controller->headers[4]->varBuffer[1]; +// char* temp = controller->PORTS_RELATED[0]->varBuffer[1]; // char* result = addParams(temp,"BATATA","{","}"); -// printf("%s\n",result); -// char* testAgain = addParams(temp,"JUDGEMENT AHS COME TO YOU","{","}"); - -// printf("%s\n",testAgain); +// printf("%s\n",result); +// char* testAgain = addParams(result,"JUDGEMENT AHS COME TO YOU","{","}"); +// printf("%s\n",testAgain); letGoHeaderControl(controller); From 2f5ab5a8db36700d144959e57390038c14566c48 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Sun, 3 Jan 2021 17:22:57 -0300 Subject: [PATCH 03/30] =?UTF-8?q?Corrigindo=20erro=20ao=20adicionar=20mais?= =?UTF-8?q?=20par=C3=A2metros=20a=20um=20m=C3=B3dulo=20ou=20declara=C3=A7?= =?UTF-8?q?=C3=A3o,=20(al=C3=A9m=20disso=20melhorando=20documenta=C3=A7?= =?UTF-8?q?=C3=A3o=20e=20organiza=C3=A7=C3=A3o=20de=20c=C3=B3digo)=20(#44,?= =?UTF-8?q?45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- headers/textManager.h | 33 ++++++++++++++++++++-- src/PreProcess.c | 1 + src/textManager.c | 64 ++++++++++++++++++++----------------------- 3 files changed, 61 insertions(+), 37 deletions(-) diff --git a/headers/textManager.h b/headers/textManager.h index 7f53640..4d83ee6 100644 --- a/headers/textManager.h +++ b/headers/textManager.h @@ -2,12 +2,41 @@ #define TM_H +/** + * Concatena strings, porém sempre retornando o final da string como ponteiro, servindo para evitar percorrer a mesma + * diversas vezes ao se concatenar várias componentes (usada ao adicionar parâmetros por exemplo). Por outro lado, + * deve ser de total responsabilidade do método que chamou esse percorrer de volta para o endereço de inicio da string original + * + * @param dest a string alocada de destino + * @param src a string origem + * @param toIgnore o caracter o qual deve ser ignorado ou onde deve pararm a concatenação + * @param ignoreMode 0 caso deve copiar tudo antes do que deve ser ignorado, + * 1 ignorar tudo antes do que deve ser ignorado incluindo ele mesmo, + * + * @sideEffects : Atualiza dest, indo para a última posição disponível em memória, ou seja, com '\0' + * @return A nova um ponteiro para o fim da string destino já preenchida + * */ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode); +/** + * Adiciona um parâmetro a uma declaração. Ex: MODULE portsModule -> MODULE portsModule(time), + * ou MODULE portsModule(time) -> MODULE portsModule(time,param2), ou ainda {0,1,NULL} -> {0,1,NULL, OCUPADO}. + * Ou seja, adiciona a qualquer delcaração com ou sem delimitadores (, {, }, ), ... um parâmetro. + * + * Caso a delcaração não possua delimitadores, esses serão adicionados ao redor do parâmetro, + * caso essa já possua delimitador, o mais a direita (ex: }, ), ... ) será removido até se preencher o parâmetro. + * + * + * @param original um ponteiro para a string original + * @param param a componente a ser adicionada + * @param + * + * @sideEffects : Atualiza o updated, seja lá de onde que essa string veio em primeiro lugar + * + * @return A nova string alocada em outro ponteiro (a responsabilidade de free ou realloc fica fora dessa função) + * */ char *addParams(char *original, char *param, char *delim1, char *delim2); - - void clearOldPortsRefs(char* oldConstraint, char* toCopyResult); /** diff --git a/src/PreProcess.c b/src/PreProcess.c index c6ec5fc..fea3b51 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -311,4 +311,5 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { free(buffer); //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); + addParamToPortsModule(Hcontrol, "random", 0); } \ No newline at end of file diff --git a/src/textManager.c b/src/textManager.c index 4b7fd92..08ec77c 100644 --- a/src/textManager.c +++ b/src/textManager.c @@ -3,11 +3,9 @@ #include #include "../headers/textManager.h" -// nota: ignore mode = 0 só o caracter especifico e tudo DEPOIS -// = 1 tudo ANTES DO CARACTER e o caracter especifico + char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { - int ignoredExtra = 0; //printf("\t[customCat] source: %s \n\n\n",src); while(*dest){ @@ -16,17 +14,12 @@ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { dest++; // vai para a "proxima posição disponivel" (no caso de strings usadas anteriormente por essa função só roda "uma vez") } while(*src){ - //printf("\t[customCat] source atual: %s \n",src); if(!ignoreMode){ *dest = *src; //printf("\t[customCat] nova string atual: %s \n",dest); dest++; } - else { - ignoredExtra++; - } - src++; if(*src == toIgnore){ //printf("\t[customCat] delimiter detected\n"); @@ -36,16 +29,9 @@ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { if(!ignoreMode){ *dest = '\0'; - --dest; + --dest; //printf("\t[customCat - ignoreMode = 0] ponteiro fim : %s \n",dest); } - else { - *dest = ignoredExtra; - //printf("\t[customCat - ignoreMode = 1] caracteres ignorados : %d \n",ignoredExtra); - //printf("\t[customCat - ignoreMode = 1] equivalencia ascii: %c \n",ignoredExtra); - // salva quantos foram ignorados! - } - //printf("\t[customCat] ponteiro 'final' string: %s \n\n\n\n",dest); return dest; } @@ -85,48 +71,56 @@ void clearOldPortsRefs(char* oldConstraint, char* toCopyResult) { char *addParams(char *original, char *param, char* delim1, char* delim2) { char *newString; - int breakline=0; - int statementEnd = 0; + char *auxNewAdd; + int breakline=0; // verifica se o final da string é \n + int statementEnd = 0; // verifica se o final da string é ; (não é nome de módulo) int tamOriginal = strlen(original); if(original[tamOriginal-1] == '\n'){ breakline = 1; } - //printf("aaaa: %c \n",original[strlen(original)-2]); + if(original[tamOriginal-2]== ';'){ statementEnd = 1; } - if(original[tamOriginal-3] == delim2[0] || original[tamOriginal-1] == delim2[0] || original[tamOriginal-2] == delim2[0]){ - newString = (char*) malloc(sizeof(char)*(strlen(original) +2+ strlen(param) +1)); // original + param + ',' + ' ' + '\0' - newString = customCat(newString,original,delim2[0],0); + // qualquer string passada (original) são das seguintes formas: xxxxxxxxx , xxxxxxxxx; , xxxxxxxxx(...)\n , xxxxxxxxx(...);\n + + // caso possua o delmitador de fechamento ) ou qualquer outro... + if(original[tamOriginal-3] == delim2[0] || original[tamOriginal-2] == delim2[0]){ + newString = (char*) calloc(strlen(original) + strlen(param) + 2 + 1, sizeof(char)); // original + param + ',' + ' ' + '\0' + auxNewAdd = newString; + auxNewAdd = customCat(auxNewAdd,original,delim2[0],0); //printf("caso 1... %s \n",newString); - newString = customCat(newString,", ",0,0); + auxNewAdd = customCat(auxNewAdd,", ",0,0); //printf("caso 1... %s \n",newString); - newString = customCat(newString,param,0,0); + auxNewAdd = customCat(auxNewAdd,param,0,0); //printf("caso 1... %s \n",newString); - newString = customCat(newString,delim2,0,0); + auxNewAdd = customCat(auxNewAdd,delim2,0,0); //printf("caso 1... %s \n",newString); } else { - //printf("%ld %ld \n",strlen(original),strlen(param)); - newString = (char*) malloc(sizeof(char)*(strlen(original) + 1 + strlen(param) + 1 + 1)); // ( ) e \0 + //printf("%ld %ld \n",strlen(original),strlen(param)); + newString = (char*) calloc(strlen(original) + 1 + strlen(param) + 1 + 1, sizeof(char)); +// newString = (char*) malloc(sizeof(char)*(strlen(original) + 1 + strlen(param) + 1 + 1)); // ( ) e \0 + auxNewAdd = newString; + if(statementEnd){ - newString = customCat(newString,original,';',0); + auxNewAdd = customCat(auxNewAdd,original,';',0); } else{ - newString = customCat(newString,original,'\n',0); + auxNewAdd = customCat(auxNewAdd,original,'\n',0); } - newString = customCat(newString,delim1,0,0); - newString = customCat(newString,param,0,0); - newString = customCat(newString,delim2,0,0); + auxNewAdd = customCat(auxNewAdd,delim1,0,0); + auxNewAdd = customCat(auxNewAdd,param,0,0); + auxNewAdd = customCat(auxNewAdd,delim2,0,0); } if(statementEnd){ - newString = customCat(newString,";",0,0); + auxNewAdd = customCat(auxNewAdd,";",0,0); } if(breakline){ - newString = customCat(newString,"\n",0,0); + auxNewAdd = customCat(auxNewAdd,"\n",0,0); } - newString = newString - ((strlen(original)+strlen(param)+2)-breakline); +// newString = newString - ((strlen(original)+strlen(param)+2)-breakline); return newString; } From 8b056d1e2fce248e1cc9a86c5095a2d254d0c989 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Tue, 5 Jan 2021 20:44:24 -0300 Subject: [PATCH 04/30] =?UTF-8?q?[#44,#45]=20Generaliza=C3=A7=C3=A3o=20ao?= =?UTF-8?q?=20propagar=20par=C3=A2metros=20concluida?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PreProcess.c | 1 + src/datastructures/HeaderSmv.c | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index fea3b51..560cade 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -312,4 +312,5 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); addParamToPortsModule(Hcontrol, "random", 0); + addParamToPortsModule(Hcontrol, "testandoDnovo", 0); } \ No newline at end of file diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index fbbfd99..c8eb689 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -284,10 +284,18 @@ void addNewHeader(HeaderController* controller, HeaderSmv* newHeader){ } } -void propagParamDependence(HeaderSmv** headers, char* param, int sizeHeaders){ +void propagParamDependence(HeaderSmv **headers, char *param, int sizeHeaders, smvtype type) { int i; + char* refOldName; char* refOldPt; for(i = 0; i < sizeHeaders; i++){ + if(type != MAIN){ + refOldName = headers[i]->moduleName; + char* newName = addParams(refOldName,param,"(",")"); + free(refOldName); + headers[i]->moduleName = newName; + } + refOldPt = headers[i]->varBuffer[headers[i]->VAR_RENAME_POINTER]; char* newDeclaration = addParams(refOldPt,param,"(",")"); free(refOldPt); @@ -302,9 +310,9 @@ void addParamToPortsModule(HeaderController *controller, char *param, int first) updated->moduleName = newName; // agora deve propagar as alterações para todos os demais módulos if(!first){ - propagParamDependence(controller->MAIN_RELATED,param,controller->H_MAIN_CURRENT_SIZE); + propagParamDependence(controller->MAIN_RELATED, param, controller->H_MAIN_CURRENT_SIZE, MAIN); } - propagParamDependence(controller->AUTOMATA_RELATED,param,controller->H_AUTOMATA_CURRENT_SIZE); + propagParamDependence(controller->AUTOMATA_RELATED, param, controller->H_AUTOMATA_CURRENT_SIZE, AUTOMATA); } From 6b5f2a00186dce3991ef61967e357d98f6aecd48 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Tue, 5 Jan 2021 20:58:20 -0300 Subject: [PATCH 05/30] =?UTF-8?q?Terminando=20refomula=C3=A7=C3=A3o=20do?= =?UTF-8?q?=20PRE-PROCESSAMENTO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PreProcess.c | 4 ++-- src/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index 560cade..9c8332c 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -311,6 +311,6 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { free(buffer); //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); - addParamToPortsModule(Hcontrol, "random", 0); - addParamToPortsModule(Hcontrol, "testandoDnovo", 0); +// addParamToPortsModule(Hcontrol, "random", 0); +// addParamToPortsModule(Hcontrol, "testandoDnovo", 0); } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 277ed0c..0075a53 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ int main(int argc, char* argv[]) { //pré processamento preProcessSmv(smvP, controller); -// setUpMainSmvTable(controller, NULL); + setUpMainSmvTable(controller, controller->mainInfo); printf("--------------------------------- EVAL ---------------------------------------------\n"); printf("\n"); From b3f2dbb58bc59920597b2466b875e1f6a859274a Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Tue, 5 Jan 2021 21:43:04 -0300 Subject: [PATCH 06/30] Considerando: #46, #47 --- headers/STable.h | 14 +++++++++++++- src/Interpreter.c | 12 ++++++++++++ src/datastructures/STable.c | 13 ++++--------- src/main.c | 2 +- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/headers/STable.h b/headers/STable.h index 8158137..2369d12 100644 --- a/headers/STable.h +++ b/headers/STable.h @@ -77,7 +77,7 @@ int checkTypeSet(STable* current, char* name, char* typeid); */ void addEntryToTypeSet(STable* current, char* name, char* typeid); -void addTypeSetSmv(char* name, void** any, int any_type, int object_size, STable* current); +void addTypeSetSmv(char *name, void **any, int object_size, STable *current); void addValue(char *name, void **any, int any_type, int object_size, int methodParam, STable *current, int timeContext); @@ -105,6 +105,7 @@ void printEntry(TableEntry* e); /** * Libera as entradas da tabela de simbolos, seguindo diferentes esquemas dependendo do type. * tupla-objeto-linguagem: n objetos de mesmo tipo (inteiro, timedirective, booleano, label, null, tds) + * tupla-init/next: pos, tamanho, pointIni, pointEnd * tupla-inteiros : pos, tamanho, pointIni, pointEnd, min, max * tupla-booleano: pos, tamanho * tupla-set: pos, tamanho, SIMPLE_HASH @@ -113,6 +114,17 @@ void printEntry(TableEntry* e); * */ void letgoEntry(TableEntry *e); +/** + * Libera as entradas da tabela de simbolos, seguindo diferentes esquemas dependendo do type. + * tupla-objeto-linguagem: n objetos de mesmo tipo (inteiro, timedirective, booleano, label, null, tds) + * tupla-inteiros : pos, tamanho, pointIni, pointEnd, min, max + * tupla-booleano: pos, tamanho + * tupla-set: pos, tamanho, SIMPLE_HASH + * + * @param e a entrada a ser liberada + * */ +void addNumericalIntervalSmv(char* name, int pos, int tam, int pointIni, int pointEnd, int min , int max, int newValue, STable* current); + #endif diff --git a/src/Interpreter.c b/src/Interpreter.c index 316f5df..0946ab6 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -9,6 +9,18 @@ typedef enum MAP_OP { PLUS = 43, MINUS = 45, TIMES = 42, DIVIDE = 47, MOD = 37, LT = 60, GT = 62, NOTEQUAL = 94, NOT_PREFIX = 110, LE = 121, EQUAL = 122, GE = 123} MAP_OP; +// caso a gente queira simplificar os parâmetros (note que muitos são desnecessários em alguns evals (MELHORIA)) +//typedef Object* (*generic_fp)(void); +/* + * generic_fp executores[80] = { + + (generic_fp ) evalNUM, (generic_fp ) evalBOOL, (generic_fp ) evalSTRING, (generic_fp ) evalNULL, (generic_fp ) evalIDVAR, (generic_fp ) evalTIME_DIRECTIVE, + (generic_fp ) evalDataV, (generic_fp ) evalPARAMS_CALL, (generic_fp ) evalDEFINE_INTERVAL , (generic_fp ) evalAC_V, + (generic_fp ) evalOTHER_ASSIGN, (generic_fp ) evalV_PROP, (generic_fp ) evalADD_V, (generic_fp ) evalADD_V_PROP, (generic_fp ) evalV_PROP_TDS, (generic_fp ) evalEXPR, (generic_fp ) + (generic_fp ) evalCMD_IF, (generic_fp ) evalMATCH_IF +}; + * */ + Object ** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index 6e51741..bb027fe 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -338,7 +338,7 @@ void addEntryToTypeSet(STable* current, char* name, char* typeid) { int present = 1; void* po = {&present}; - addValue(typeid, po, NUMBER_ENTRY, 1, 0, entry->val->values[2], 0); + addValue(typeid, po, LOGICAL_ENTRY, 1, 0, entry->val->values[2], 0); } } @@ -368,7 +368,7 @@ void addEntryToTypeSet(STable* current, char* name, char* typeid) */ -void addTypeSetSmv(char* name, void** any, int any_type, int object_size, STable* current) +void addTypeSetSmv(char *name, void **any, int object_size, STable *current) { printf("[addTypeSetSmv] add var-name: %s to %s \n",name,mappingEnumTable[current->type]); STable* hashset = createTable(SIMPLE_HASH,NULL,0,0); @@ -377,7 +377,7 @@ void addTypeSetSmv(char* name, void** any, int any_type, int object_size, STable printf("[addTypeSetSmv] (index: %d, size: %d) \n",*(int*)po[0],*(int*)po[1]); - addValue(name, po, any_type, object_size + 1, 0, current, 0); + addValue(name, po, TYPE_SET, object_size + 1, 0, current, 0); } void addNumericalIntervalSmv(char* name, int pos, int tam, int pointIni, int pointEnd, int min , int max, int newValue, STable* current){ @@ -408,14 +408,9 @@ void addWriteInfo(char* name, void** any, int any_type, int object_size, STable* // refatorar? os dois métodos, usar só um que recebe "qualquer coisa" e encapsula em um objeto void addValue(char *name, void **any, int any_type, int object_size, int methodParam, STable *current, int timeContext) { - - // note que po é um ponteiro para objetos que o novo objeto irá encapsular, como criar ? - + // note que po é um ponteiro para objetos que o novo objeto irá encapsular, como criar ? // POR ENQUANTO: - //void* pa[] = {&vali}; (pro :possibilita manipular arrays) (cons: tenho que tratar tudo como vetor até quando é um unico valor) - - Object* o = createObject(any_type, object_size, any, timeContext, NULL); o->SINTH_BIND = o->SINTH_BIND? o->SINTH_BIND : name; addValueCurrentScope(name,o,methodParam,current); diff --git a/src/main.c b/src/main.c index 0075a53..5c5158d 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ int main(int argc, char* argv[]) { //pré processamento preProcessSmv(smvP, controller); - setUpMainSmvTable(controller, controller->mainInfo); + setUpMainSmvTable(controller, global); printf("--------------------------------- EVAL ---------------------------------------------\n"); printf("\n"); From dde5de0f2d3b3e8db8908919ae7608d19706afc7 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Tue, 5 Jan 2021 21:43:52 -0300 Subject: [PATCH 07/30] Adicionando arquivo que faltou do ultimo commit (#46, #47) --- src/PreProcess.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index 9c8332c..cbcb6f4 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -51,7 +51,7 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen char name[] = {line[1],'\0'}; //addValue(name,po,TYPE_SET,2,0,portsSmv); - addTypeSetSmv(name, po, TYPE_SET, 2, writeSmvTypeTable); + addTypeSetSmv(name, po, 2, writeSmvTypeTable); } header->VAR_POINTER += 1; } @@ -126,14 +126,18 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) int pointIni; int pointEnd; int tam = strlen(linhaLida); + int min; + int max; auxDelim = strstr(linhaLida,":"); auxFim = strstr(auxDelim,".."); pointIni = (auxDelim-linhaLida+2); pointEnd = ((auxFim-linhaLida))-1; + min = 0; + max = 3; - void* po[] = {&pos, &tam, &pointIni, &pointEnd}; - addValue(nome, po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); + void* po[] = {&pos, &tam, &pointIni, &pointEnd,&min,&max}; // poderia generalizar isso aqui para evitar grandes erros + addValue(nome, po, WRITE_SMV_INFO, 6, 0, Hcontrol->mainInfo, 0); // remover depois? (assim como a gente deve fazer o no pré processamento o "loop do time") @@ -148,7 +152,6 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) addValue("init(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); - char* linhaLidaNext = Hcontrol->MAIN_RELATED[0]->assignBuffer[3]; pos = 3; // note que a posição de inicio de leitura do next é irrelevante pela formatação do case tam = strlen(linhaLidaNext); @@ -160,7 +163,6 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) addValue("next(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); // ele salva: time = 6 : 0; (reboot) ou time < 3: time + 1; (incremento até F_TIME) - // seta as diretivas temporais globais da linguagem char* diretivas[] = {"I_TIME", "C_TIME","F_TIME"}; From 81ec40603b2fb2c1af107226063f0177c96a2516 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Wed, 6 Jan 2021 00:14:03 -0300 Subject: [PATCH 08/30] =?UTF-8?q?Refletindo=20as=20mudan=C3=A7as=20da=20re?= =?UTF-8?q?formula=C3=A7=C3=A3o=20do=20pr=C3=A9=20processamento=20nos=20de?= =?UTF-8?q?mais=20m=C3=B3dulos=20(#44,#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- headers/STable.h | 2 ++ src/datastructures/STable.c | 4 ++-- src/main.c | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/headers/STable.h b/headers/STable.h index 2369d12..b26f84c 100644 --- a/headers/STable.h +++ b/headers/STable.h @@ -37,7 +37,9 @@ typedef struct S_TABLE int order; SCOPE_TYPE type; char* conditionBind; + int childOfFunction; TableEntry** tableData; + // info relacionada a inclusão int lastEntryIndex; int backup; int collision; diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index bb027fe..aa3460b 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -76,7 +76,6 @@ void printEntry(TableEntry* e) { -/// table STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { @@ -102,9 +101,10 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { newtable->lastEntryIndex = 0; newtable->backup = 0; newtable->collision = 0; - newtable->conditionBind == NULL; + newtable->conditionBind = NULL; newtable->children = NULL; newtable->parent = parent; + newtable->childOfFunction = parent->type == FUNC || parent->childOfFunction; /* if(chillist){ diff --git a/src/main.c b/src/main.c index 5c5158d..e10d1ea 100644 --- a/src/main.c +++ b/src/main.c @@ -52,7 +52,7 @@ int main(int argc, char* argv[]) { printf("\n"); //pos processamento - //eval(root,global,writeSmvTypeTable,controller); + eval(root, global, controller); printf("\n"); printf("------------------------------------------------------------------------------\n"); From 2d2cbfcd0e1369dee7686cf7f5936e9cb2982ba3 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Wed, 6 Jan 2021 00:15:26 -0300 Subject: [PATCH 09/30] =?UTF-8?q?Refletindo=20mudan=C3=A7as=20do=20pr?= =?UTF-8?q?=C3=A9=20processamento=20e=20Preparando=20para=20tratamento=20d?= =?UTF-8?q?e=20fun=C3=A7=C3=B5es(#43,#44,#45,#48)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- headers/HeaderSmv.h | 3 +- headers/Interpreter.h | 2 +- src/Interpreter.c | 144 ++++++++++++++++++++------------- src/datastructures/HeaderSmv.c | 4 +- 4 files changed, 92 insertions(+), 61 deletions(-) diff --git a/headers/HeaderSmv.h b/headers/HeaderSmv.h index 41c523b..f7d607c 100644 --- a/headers/HeaderSmv.h +++ b/headers/HeaderSmv.h @@ -38,9 +38,10 @@ typedef struct headerController int declaredPorts; STable* mainInfo; STable* portsInfo; + STable** functionsInfo; //int CURRENT_SIZE; // usar current size com -1 (se vc está processando o indice atual(ultimo) é porque ele já alocou para o seguinte!) // ex: sétimo membro(6) (CURRENT_SIZE = 7) (ou seja para referenciar o último é só pegar CURRENT-1) - + }HeaderController; HeaderController *createController(); diff --git a/headers/Interpreter.h b/headers/Interpreter.h index 82ba6ac..861951a 100644 --- a/headers/Interpreter.h +++ b/headers/Interpreter.h @@ -12,7 +12,7 @@ #include "Node.h" #include "Object.h" -Object * eval(Node* node, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object *eval(Node *n, STable *scope, HeaderController *controllerSmv); #endif diff --git a/src/Interpreter.c b/src/Interpreter.c index 0946ab6..3b95eec 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -21,34 +21,61 @@ typedef enum MAP_OP { PLUS = 43, MINUS = 45, TIMES = 42, DIVIDE = 47, MOD = 37, }; * */ -Object ** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalSTRING(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalNULL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalIDVAR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalTIME_DIRECTIVE(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalDataV(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalPARAMS_CALL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalAC_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalV_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalADD_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalADD_V_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object* evalV_PROP_TDS(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object * evalEXPR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object * evalCMD_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); -Object * evalMATCH_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); - -Object* (*executores[80]) (Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) = { +Object **eval(Node *n, STable *scope, HeaderController *controllerSmv); +Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv); + +STable* selectSMV_SCOPE(STable* scope, HeaderController* controllerSmv){ + if(scope->type == FUNC || scope->childOfFunction){ + return controllerSmv->functionsInfo[scope->order]; + } + else{ + return controllerSmv->mainInfo; // só vai retornar ports em casos de declarações de tds + } +} + +HeaderSmv * selectSMV_INFO(STable* scope, Object* functionPointer,HeaderController* controllerSmv){ + if(!functionPointer){ + return controllerSmv->MAIN_RELATED[0]; + } + else{ + int ALL_FUNCTION = *(int*) functionPointer->values[3]; +// int TDS_FUNCTION = *(int*) functionPointer->values[4]; + if(ALL_FUNCTION){ + return accessHeader(controllerSmv,MAIN,ALL_FUNCTION); + } +// if(TDS_FUNCTION){ +// return accessHeader(controllerSmv,PORTS,TDS_FUNCTION); +// } + fprintf(stderr, "FUNCTION SMV INFO NOT FOUND"); + exit(-1); + } +} + +Object* (*executores[80]) (Node* n, STable* scope, HeaderController* controllerSmv) = { evalNUM, evalBOOL, evalSTRING, evalNULL, evalIDVAR, evalTIME_DIRECTIVE, evalDataV, evalPARAMS_CALL, evalDEFINE_INTERVAL ,evalAC_V, evalOTHER_ASSIGN, evalV_PROP, evalADD_V, evalADD_V_PROP, evalV_PROP_TDS, evalEXPR, evalCMD_IF, evalMATCH_IF }; -Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv) { int sint; sint = atoi(n->leafs[0]); @@ -58,7 +85,7 @@ Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContro return o; } -Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalBOOL] \n"); int sint; @@ -77,7 +104,7 @@ Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContr } -Object* evalSTRING(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalSTRING] \n"); char* sint = n->leafs[0]; @@ -97,7 +124,7 @@ Object* evalSTRING(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderCon */ -Object* evalNULL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalNULL] \n"); // se eu interpretar como "NULL" do C mesmo podemos ter problemas(?) @@ -113,7 +140,7 @@ Object* evalNULL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContr } -Object* evalIDVAR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalIDVAR] \n"); @@ -157,7 +184,7 @@ Object* evalIDVAR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderCont } -Object* evalTIME_DIRECTIVE(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalTIME_DIRECTIVE] \n"); @@ -178,7 +205,7 @@ Object* evalTIME_DIRECTIVE(Node* n, STable* scope, STable** writeSmvTypeTable, H -Object* evalDataV(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalDataV] \n"); @@ -194,7 +221,7 @@ Object* evalDataV(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderCont // vai chamar evalParams , e sintetizar um Object Vetor (ou um vetor void que será jogado em um object) } -Object* evalPARAMS_CALL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalPARAMS_CALL] \n"); } @@ -349,14 +376,14 @@ Object* evalEqual(Object* o1, Object* o2, int opCode) -Object* evalEXPR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalEXPR] \n"); // operação unária ou simplesmente FOLHA if(n->nchild <= 1) { Object * sintUni; - Object** sint = eval(n->children[0],scope,writeSmvTypeTable,controllerSmv); + Object** sint = eval(n->children[0], scope, controllerSmv); sintUni = sint[0]; char ops[1]; @@ -383,8 +410,8 @@ Object* evalEXPR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContr else { // CUIDADO (ordem avaliação) - Object* o1 = evalEXPR(n->children[0], scope, writeSmvTypeTable, controllerSmv); - Object* o2 = evalEXPR(n->children[1],scope, writeSmvTypeTable, controllerSmv); + Object* o1 = evalEXPR(n->children[0], scope, controllerSmv); + Object* o2 = evalEXPR(n->children[1],scope, controllerSmv); int sOp = strlen(n->leafs[0]); char ops[2]; @@ -485,7 +512,7 @@ Object* evalEXPR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContr } -Object* evalProp(Node* fatherRef, Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalProp(Node* fatherRef, Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalProp] \n"); if(!n) @@ -506,7 +533,7 @@ Object* evalProp(Node* fatherRef, Node* n, STable* scope, STable** writeSmvTypeT } if(n->type == ADD_V) { - Object* expr = evalEXPR(n->children[0],scope, writeSmvTypeTable, controllerSmv); + Object* expr = evalEXPR(n->children[0],scope, controllerSmv); if(expr->type != NUMBER_ENTRY) { fprintf(stderr, "%s: INVALID INDEX!", fatherRef->leafs[0]); @@ -523,7 +550,7 @@ Object* evalProp(Node* fatherRef, Node* n, STable* scope, STable** writeSmvTypeT } -Object* evalAC_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv) { printf("[evalAC_V] \n"); @@ -537,7 +564,7 @@ Object* evalAC_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContr } else { - Object* prop = evalProp(n,n->children[0], scope, writeSmvTypeTable, controllerSmv); + Object* prop = evalProp(n,n->children[0], scope, controllerSmv); if(entry->val->OBJECT_SIZE > 1) { @@ -553,22 +580,22 @@ Object* evalAC_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderContr } } -Object* evalV_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv){ printf("[evalV_PROP] \n"); } -Object* evalADD_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv){ printf("[evalADD_V] \n"); } -Object* evalADD_V_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv){ printf("[evalADD_V_PROP] \n"); } -Object* evalV_PROP_TDS(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv){ printf("[evalV_PROP_TDS] \n"); } -Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv){ int I_TIME; int* ptitime = NULL; @@ -604,7 +631,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, void* vp[] = {ptitime}; updateValue("I_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",I_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,0,0); + updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,0,0); // necessita atualizar C_TIME updateValue("C_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); } @@ -612,12 +639,12 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, void* vp[] = {ptftime}; updateValue("F_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",F_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,1,1); + updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,1,1); } return NULL; } -Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv) { Object* expr = NULL; Object** sintExpr = NULL; @@ -640,7 +667,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea //Mudou CONTEXTO (C_TIME) : seguir o caso default // objeto sintetizado (chamar fora ou dentro do if depois das validações? avisa erros mais rapido) - sintExpr = eval(n->children[1],scope,writeSmvTypeTable,controllerSmv); + sintExpr = eval(n->children[1], scope, controllerSmv); expr = sintExpr[0]; if(expr && expr->type != NUMBER_ENTRY && expr->OBJECT_SIZE > 1) { @@ -669,7 +696,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea } else{ // busca expressão - sintExpr = eval(n->children[1],scope,writeSmvTypeTable,controllerSmv); + sintExpr = eval(n->children[1], scope, controllerSmv); expr = sintExpr[0]; // busca a variável e seu contexto @@ -684,15 +711,16 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea minmax = new > old; } // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) - STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); - HeaderSmv* refHeader = accessHeader(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN ,scope->order); + //STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); + STable* refAuxTable = selectSMV_SCOPE(scope,controllerSmv); + HeaderSmv* refHeader = selectSMV_INFO(scope,expr->type == FUNCTION_ENTRY? expr : NULL,controllerSmv); + //HeaderSmv* refHeader = accessHeader(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN ,scope->order); TableEntry* itimeEntry = lookup(scope,"I_TIME"); int itime = *(int*)itimeEntry->val->values[0]; int changeContext = ctime > itime; // verifica se mudou o contexto //binds da expressão - char directiveValueBind[300]; // tempo corrente // SINTH_BIND do valor da expressão (ou com o valor dela ou com o smv SINTH_BIND) char valueBind[300]; // SINTH_BIND do valor default caso a atribuição venha a necessitar criar um init e next juntos @@ -764,7 +792,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea } Node* ref = n->children[0]->children[0]; - Object* indexRef = ref->type == V_PROP ? NULL : eval(n,scope,writeSmvTypeTable,controllerSmv)[0]; + Object* indexRef = ref->type == V_PROP ? NULL : eval(n, scope, controllerSmv)[0]; if(ref->type == V_PROP || ref->type == ADD_V_PROP) { @@ -800,19 +828,19 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea return NULL; } -Object * evalCMD_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv){ Object* conditionalExpr = NULL; Object** sintExpr = NULL; STable* IF_SCOPE = addSubScope(scope,IF_BLOCK); - sintExpr = eval(n->children[0],scope,writeSmvTypeTable,controllerSmv); + sintExpr = eval(n->children[0], scope, controllerSmv); conditionalExpr = sintExpr[0]; printObject(conditionalExpr); bindCondition(IF_SCOPE,conditionalExpr); if(*(int*)conditionalExpr->values[0]){ - eval(n->children[1],IF_SCOPE,writeSmvTypeTable,controllerSmv); // tenho que passar um parâmetro que define se avaliou + eval(n->children[1], IF_SCOPE, controllerSmv); // tenho que passar um parâmetro que define se avaliou } else{ if(n->children[1]){ @@ -822,12 +850,12 @@ Object * evalCMD_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderCo return NULL; } -Object * evalMATCH_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ +Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv){ } -Object** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) +Object **eval(Node *n, STable *scope, HeaderController *controllerSmv) { printf("[eval] %s \n",n->name); if(n) @@ -841,7 +869,7 @@ Object** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderControll if(executores[n->type]) { printf("[PostProcess - eval] eval especifico \n\n"); - SYNTH_O[0] = executores[n->type](n,scope,writeSmvTypeTable,controllerSmv); + SYNTH_O[0] = executores[n->type](n,scope,controllerSmv); } else { @@ -855,7 +883,7 @@ Object** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderControll if(toEval) { printf("(%d) %s \n",i,toEval->name); - Object** SYNTH_SET = eval(n->children[i],scope,writeSmvTypeTable,controllerSmv); + Object** SYNTH_SET = eval(n->children[i], scope, controllerSmv); SYNTH_O[i] = SYNTH_SET[0]; free(SYNTH_SET); } diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index c8eb689..1354137 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -101,6 +101,7 @@ void letGoHeadersStruct(HeaderController *H) { HeaderController *createController() { int DEFAULT_HEADERS_SIZE = 5; + int DEFAULT_FUNCTIONS = 300; HeaderController* Hcontrol = malloc(sizeof(HeaderController)); Hcontrol->H_MAIN_CURRENT_SIZE = 0; @@ -109,10 +110,11 @@ HeaderController *createController() { Hcontrol->mainInfo = createTable(SMV_V_MAIN,NULL,0,0); Hcontrol->portsInfo = createTable(SMV_PORTS,NULL,0,0); + Hcontrol->functionsInfo = malloc(sizeof(STable*)*DEFAULT_FUNCTIONS); Hcontrol->MAIN_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); Hcontrol->AUTOMATA_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); - Hcontrol->PORTS_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE);; + Hcontrol->PORTS_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); Hcontrol->declaredPorts=0; return Hcontrol; From 4b46cf246339070173d35fd7fd1b20156bb70f91 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Wed, 6 Jan 2021 00:22:02 -0300 Subject: [PATCH 10/30] Atualizando exemplo --- sample/basic-main/basic.tds | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/sample/basic-main/basic.tds b/sample/basic-main/basic.tds index 6db0358..f19343a 100644 --- a/sample/basic-main/basic.tds +++ b/sample/basic-main/basic.tds @@ -1,25 +1,38 @@ INTERVAL: 0 ~ 20 +x = 2 //redef =0 , context =0 +// usei aqui o x +x = 30 //redef =1 , context =0 +// usei redef1 -x = 1 +//z = true -y = 30 +z = false // ERRO -> corrigido -x = 20 +if(not z){ + w = 1 +} C_TIME = 2 +x = 4 //redef =1 , context =2 +// estamos em time =2 e referenciamos redef1 +// fizemos várias operações que nem a de C_TIME = 3 ... (que geraria colisão = atualiza a condição anterior) -x = 3 +C_TIME = 2 +x = 90 //redef =1 , context =2 // erro (caso de , variavel foi redefinida em time > 0)(unico que não funciona ainda) +y = 1 // e se esse y depender de x? ele vai estar olhando agora o x =5! NÃO O IGUAL A 4... -x= 4 C_TIME = 3 +x = 80 // // usa redef(next) anterior , context =3 -y = 0 +// e como vamos lidar com INVAR? (a pensar ainda...? Criar um buffer invar! E escrever em ordem no final!, "utilidade") -x = 80 +z = false // ERRO -> corrigido -//condicaoTeste = true +if(not z){ + w = 1 +} From b71e54cb2212a9c4eaa805e5dcb74bc94ac98c7a Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Wed, 6 Jan 2021 00:22:26 -0300 Subject: [PATCH 11/30] =?UTF-8?q?Corrigindo=20segfault=20ao=20tentar=20ref?= =?UTF-8?q?erenciar=20escopo=20pai,=20note=20que=20ainda=20temos=20um=20er?= =?UTF-8?q?ro=20da=20reformula=C3=A7=C3=A3o=20do=20pr=C3=A9=20processament?= =?UTF-8?q?o=20e=20temos=20que=20terminar=20o=20tratamento=20de=20inteiros?= =?UTF-8?q?=20(#43,#44,#45)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/PreProcess.c | 2 -- src/datastructures/HeaderSmv.c | 8 ++++---- src/datastructures/STable.c | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index cbcb6f4..9353158 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -313,6 +313,4 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { free(buffer); //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); -// addParamToPortsModule(Hcontrol, "random", 0); -// addParamToPortsModule(Hcontrol, "testandoDnovo", 0); } \ No newline at end of file diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index 1354137..78dac8e 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -286,12 +286,12 @@ void addNewHeader(HeaderController* controller, HeaderSmv* newHeader){ } } -void propagParamDependence(HeaderSmv **headers, char *param, int sizeHeaders, smvtype type) { +void propagParamDependence(HeaderSmv **headers, char *param, int sizeHeaders, smvtype type, int first) { int i; char* refOldName; char* refOldPt; for(i = 0; i < sizeHeaders; i++){ - if(type != MAIN){ + if(!first && type != MAIN){ refOldName = headers[i]->moduleName; char* newName = addParams(refOldName,param,"(",")"); free(refOldName); @@ -312,9 +312,9 @@ void addParamToPortsModule(HeaderController *controller, char *param, int first) updated->moduleName = newName; // agora deve propagar as alterações para todos os demais módulos if(!first){ - propagParamDependence(controller->MAIN_RELATED, param, controller->H_MAIN_CURRENT_SIZE, MAIN); + propagParamDependence(controller->MAIN_RELATED, param, controller->H_MAIN_CURRENT_SIZE, MAIN, first); } - propagParamDependence(controller->AUTOMATA_RELATED, param, controller->H_AUTOMATA_CURRENT_SIZE, AUTOMATA); + propagParamDependence(controller->AUTOMATA_RELATED, param, controller->H_AUTOMATA_CURRENT_SIZE, AUTOMATA, first); } diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index aa3460b..cc645d4 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -104,7 +104,7 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { newtable->conditionBind = NULL; newtable->children = NULL; newtable->parent = parent; - newtable->childOfFunction = parent->type == FUNC || parent->childOfFunction; + newtable->childOfFunction = parent && (parent->type == FUNC || parent->childOfFunction); /* if(chillist){ From 33070a4a0a74a131afd4d378a73ffe7849f2b4e7 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Wed, 6 Jan 2021 00:29:58 -0300 Subject: [PATCH 12/30] =?UTF-8?q?Adicionando=20newSmvfile=20como=20demonst?= =?UTF-8?q?ra=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- results/newSmvfile.smv | 98 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 results/newSmvfile.smv diff --git a/results/newSmvfile.smv b/results/newSmvfile.smv new file mode 100644 index 0000000..40cbdd4 --- /dev/null +++ b/results/newSmvfile.smv @@ -0,0 +1,98 @@ +MODULE main +VAR + time: 0..20; + finalAutomata: finalAutomata(time); + x : 2..2; + x_redef1 : 4..30; + z : boolean; + w_scope1_0 : 1..1; + x_redef2 : 0..90; + y : 0..1; + w_scope1_1 : 0..1; +ASSIGN + init(time) := 0; + next(time) := case + time < 20: time + 1; + TRUE: time; +esac; + init(x):= 2; + init(x_redef1):= 30; + init(z):= FALSE; + init(w_scope1_0):= case + !z : 1; + TRUE : 0; + esac; + next(x_redef1):= case + next(time) = 2 : 4; + TRUE : x_redef1; + esac; + init(x_redef2):= 0; + next(x_redef2):= case + next(time) = 2 : 90; + TRUE : x_redef2; + esac; + init(y):= 0; + next(y):= case + next(time) = 2 : 1; + TRUE : y; + esac; + next(z):= case + next(time) = 3 : FALSE; + TRUE : z; + esac; + init(w_scope1_1):= 0; + next(w_scope1_1):= case + next(time) = 3 & !z : 1; + TRUE : w_scope1_1; + esac; + +MODULE merger1(time) +VAR + ports: portsModule(time); + cs: {q0}; +TRANS + ((cs = q0 & ports.b = NULL & ports.d = NULL & ports.c != NULL & ports.a = ports.c & FALSE) -> next(cs) = q0) & + ((cs = q0 & ports.a = NULL & ports.d = NULL & ports.c != NULL & ports.b = ports.c & FALSE) -> next(cs) = q0); + +MODULE fifo2(time) +VAR + ports: portsModule(time); + cs: {q0,p0,p1}; +ASSIGN + init(cs) := {q0}; +TRANS + ((cs = q0 & ports.a = NULL & ports.b = NULL & ports.d = NULL & ports.c = 0 & FALSE) -> next(cs) = p0) & + ((cs = q0 & ports.a = NULL & ports.b = NULL & ports.d = NULL & ports.c = 1 & FALSE) -> next(cs) = p1) & + ((cs = p0 & ports.a = NULL & ports.c = NULL & ports.b = NULL & ports.d = 0) -> next(cs) = q0) & + ((cs = p0) -> ((next(cs) != p1))) & + ((cs = p1 & ports.a = NULL & ports.c = NULL & ports.b = NULL & ports.d = 1) -> next(cs) = q0) & + ((cs = p1) -> ((next(cs) != p0))); + +MODULE finalAutomata(time) +VAR + prod1: merger1(time); + prod2: fifo2(time); + ports: portsModule(time); + cs: {q0q0,q0p0,q0p1}; +ASSIGN + init(cs) := {q0q0}; +TRANS + ((cs = q0q0 & ports.b = NULL & ports.d = NULL & ports.c != NULL & ports.a = ports.c & ports.c = 0) -> next(cs) = q0p0) & + ((cs = q0q0 & ports.b = NULL & ports.d = NULL & ports.c != NULL & ports.a = ports.c & ports.c = 1) -> next(cs) = q0p1) & + ((cs = q0q0 & ports.a = NULL & ports.d = NULL & ports.c != NULL & ports.b = ports.c & ports.c = 0) -> next(cs) = q0p0) & + ((cs = q0q0 & ports.a = NULL & ports.d = NULL & ports.c != NULL & ports.b = ports.c & ports.c = 1) -> next(cs) = q0p1) & + ((cs = q0p0) -> ((next(cs) != q0p1))) & + ((cs = q0p1) -> ((next(cs) != q0p0))); +INVAR + (((prod1.cs = q0) & (prod2.cs = q0)) <-> (cs = q0q0)) & + (((prod1.cs = q0) & (prod2.cs = p0)) <-> (cs = q0p0)) & + (((prod1.cs = q0) & (prod2.cs = p1)) <-> (cs = q0p1)); + +MODULE portsModule(time) +VAR + a : array 0..5 of {NULL, 0, 1}; + c : array 0..5 of {NULL, 0, 1}; + b : array 0..5 of {NULL, 0, 1}; + d : array 0..5 of {NULL, 0, 1}; +ASSIGN + From cd5b1ae8c3797f047963c6e11caa403d27830b15 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Wed, 6 Jan 2021 17:17:00 -0300 Subject: [PATCH 13/30] Adicionando alternativo smv --- sample/merger-fifo/merger-fifoModule.smv | 140 +++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 sample/merger-fifo/merger-fifoModule.smv diff --git a/sample/merger-fifo/merger-fifoModule.smv b/sample/merger-fifo/merger-fifoModule.smv new file mode 100644 index 0000000..8aa3288 --- /dev/null +++ b/sample/merger-fifo/merger-fifoModule.smv @@ -0,0 +1,140 @@ +MODULE main + +IVAR + defineModo : boolean; -- só pode ser usado em next's... perde parte da utilidade + +VAR + time : 0..6; + -- time : integer; não podemos fazer nada assim porque o modelChecker fica limitado, considerando que BDD não pode ser usado! + modoEntrada : boolean; + enumerado: {OCUPADO}; + automata : finalAutomata(time,modoEntrada); + +ASSIGN + init(time) := 0; + init(modoEntrada):= FALSE; + -- não podemos usar input vars porque elas possuem sérias limitações nos assigns + next(time) := case + time = 6 : 0; + TRUE : time + 1; + esac; + next(modoEntrada) := case + next(time) = 2 & defineModo: TRUE; + time = 6 : FALSE; + TRUE : modoEntrada; + esac; + +CTLSPEC AG( ( automata.ports.a.value != NULL & automata.ports.b.value = NULL) + |(automata.ports.a.value = NULL & automata.ports.b.value != NULL) + | (automata.ports.a.value = NULL & automata.ports.b.value = NULL)) ; + +MODULE portsModule(time,modoEntrada) +VAR +-- a: {0, 1, NULL}; +-- b: {0, 1, 4,5,6,7,8, NULL}; +-- balt: {1}; +-- c: {NULL, 0, 1, 5,7,6,9,8,10, 4}; +-- d: {NULL, 0, 1, 5,7,6,9,8,10, 4}; +-- invertScopeB : boolean; + a: tds_a(time); + b: tds_b(time,modoEntrada); + c: port_c(time); + d: port_d(time); +-- c: {NULL, 0, 1}; +-- d: {NULL, 0, 1}; +ASSIGN + + init(c.value):= case + a.value = NULL : b.value; + b.value = NULL : a.value; + TRUE : NULL ; + esac; + init(d.value):= NULL; + + + next(c.value):= + case + next(a.value) = NULL : next(b.value); + next(b.value) = NULL : next(a.value); + TRUE : NULL ; + esac; + + next(d.value):= case + d.value = NULL : c.value; + c.value = NULL & d.value != NULL : NULL; + TRUE : d.value; + esac; + + +MODULE tds_a(time) + VAR + value: {0, 1, NULL}; + ASSIGN + + init(value):= 0; + next(value):= + case + next(time) = 1 : 1; + next(time) = 2 : 0; + next(time) = 0 : 0; --reset para valor init + TRUE : NULL; + esac; + +MODULE tds_b(time,modoEntrada) + VAR + value: {0, 1, NULL}; + invert : boolean; + ASSIGN + init(invert) := !modoEntrada; + next(invert) := !next(modoEntrada); + + init(value):= NULL; + next(value):= case + next(time) = 0 | next(time) < 2: NULL; + !invert & next(time) != 6 : next(time) mod 2; + TRUE : NULL; + esac; + + +MODULE port_c(time) + VAR + value: {0, 1, NULL}; + ASSIGN + +MODULE port_d(time) + VAR + value: {0, 1, NULL}; + ASSIGN + + + + +MODULE finalAutomata(time, modoEntrada) + VAR + cs : {q0q0, p0q0, p1q0}; + ports : portsModule(time,modoEntrada); + ASSIGN + init(cs) := {q0q0}; +TRANS + ( (cs = q0q0 & ports.b.value = NULL & ports.c.value != NULL & ports.a.value = ports.c.value + & ports.d.value = NULL & ports.c.value = 0 ) -> next(cs) = p0q0 ) & + + ( (cs = q0q0 & ports.a.value = NULL & ports.c.value != NULL & ports.b.value = ports.c.value + & ports.d.value = NULL & ports.c.value = 0 ) -> next(cs) = p0q0 ) & + + ( (cs = q0q0 & ports.b.value = NULL & ports.c.value != NULL & ports.a.value = ports.c.value + & ports.d.value = NULL & ports.c.value = 1 ) -> next(cs) = p1q0 ) & + + ( (cs = q0q0 & ports.a.value = NULL & ports.c.value != NULL & ports.b.value = ports.c.value + & ports.d.value = NULL & ports.c.value = 1 ) -> next(cs) = p1q0 ) & + + ( (cs = p0q0 & ports.c.value = NULL & ports.d.value = 0 ) -> next(cs) = q0q0 ) & + + ( (cs = p0q0) -> ( (next(cs) != p1q0 ) ) ) & + + ( (cs = p1q0 & ports.c.value = NULL & ports.d.value = 1 ) -> next(cs) = q0q0 ) & + + ( (cs = p1q0) -> ( (next(cs) != p0q0 ) ) ) + + + From fd687a09e4d2f99b141a835dba40cdc4bb1a1215 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Thu, 7 Jan 2021 00:40:01 -0300 Subject: [PATCH 14/30] =?UTF-8?q?Resolve=20#32=20e=20#43=20(falta=20limpez?= =?UTF-8?q?a=20de=20c=C3=B3digo,=20e=20corrigir=20memory=20leak=20ao=20fin?= =?UTF-8?q?al=20do=20c=C3=B3digo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- headers/HeaderSmv.h | 2 +- headers/PostProcess.h | 34 ++++++++--- src/Interpreter.c | 78 +++++++------------------ src/PostProcess.c | 113 ++++++++++++++++++++++-------------- src/datastructures/STable.c | 3 + 5 files changed, 118 insertions(+), 112 deletions(-) diff --git a/headers/HeaderSmv.h b/headers/HeaderSmv.h index f7d607c..a19013e 100644 --- a/headers/HeaderSmv.h +++ b/headers/HeaderSmv.h @@ -2,7 +2,7 @@ #define HEADER_H -#include +#include "STable.h" #include "textManager.h" #include "Enum.h" diff --git a/headers/PostProcess.h b/headers/PostProcess.h index 2df3dc0..0d46b98 100644 --- a/headers/PostProcess.h +++ b/headers/PostProcess.h @@ -31,7 +31,7 @@ void copyValueBind(Object* o, char* bind,int index,int defaultValue); * o init(time) ou next(time) dependendo se for I_TIME ou F_TIME * */ -void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValue, int type, int typeExrp,int minmax); +void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValueBind, int type, int typeExpr, int *newValue); /** * Cria um cubo de condições da forma: @@ -58,9 +58,27 @@ void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValue, in * */ char *createConditionCube(char *opBind1, char *opBind2, char *operation, char *evaluation, int firstCond); -/***/ +/** + * Cria um bind SMV partindo de uma expressão entre duas objetos componentes (que também podem ser expressões que já tem bind de expressão) + * @param result o ponteiro para + * @param o1 a primeira componente da expressão + * @param o2 a segunda componente da expressão + * @param op a operação que junta as componentes + * + * @SideEffects: Escreve a expressão no buffer result, isso evita um malloc e free atoa, já que essa string já será passada como parâmetro + * para o create Object (que vai fazer um malloc também). + * */ void createExprBind(char *result, Object *o1, Object *o2, char *op); -/***/ + +/** + * Associa uma condição (vinda de um objeto) a um escopo + * + * @param scope a tabela de simbolos corrente + * @param conditionExpr o objeto expressão + * + * @SideEffects: Associa o bind desse objeto ao escopo, alocando memória para essa condição + * + * */ void bindCondition(STable* scope, Object* conditionExpr); /** @@ -126,17 +144,17 @@ void createAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, c * além disso, atualiza na entrada da tabela da simbolos o tipo (typeSet) associada a varName, * se o tipo mudar (caso de next após mudança de contexto). * */ -void updateAssign(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, char* newValue, char* condition, int type ,int typeExpr, int minmax); +void updateAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, int type, + int typeExpr); /** * Escolhe entre update/create Assign de casos init/next tratando casos de redefinição e condições * @param * @sideEffects: Todos os colaterais de updateAssign ou createAssign * */ -void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, - char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, int minmax); - - +void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValueBind, char *condition, + char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, + void *newValue); void writeResultantHeaders(HeaderController* controller, const char* path); diff --git a/src/Interpreter.c b/src/Interpreter.c index 3b95eec..aa1aaa4 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -5,42 +5,11 @@ #include #include #include "../headers/PostProcess.h" +#include "../headers/InterpreterEvals.h" typedef enum MAP_OP { PLUS = 43, MINUS = 45, TIMES = 42, DIVIDE = 47, MOD = 37, LT = 60, GT = 62, NOTEQUAL = 94, NOT_PREFIX = 110, LE = 121, EQUAL = 122, GE = 123} MAP_OP; -// caso a gente queira simplificar os parâmetros (note que muitos são desnecessários em alguns evals (MELHORIA)) -//typedef Object* (*generic_fp)(void); -/* - * generic_fp executores[80] = { - - (generic_fp ) evalNUM, (generic_fp ) evalBOOL, (generic_fp ) evalSTRING, (generic_fp ) evalNULL, (generic_fp ) evalIDVAR, (generic_fp ) evalTIME_DIRECTIVE, - (generic_fp ) evalDataV, (generic_fp ) evalPARAMS_CALL, (generic_fp ) evalDEFINE_INTERVAL , (generic_fp ) evalAC_V, - (generic_fp ) evalOTHER_ASSIGN, (generic_fp ) evalV_PROP, (generic_fp ) evalADD_V, (generic_fp ) evalADD_V_PROP, (generic_fp ) evalV_PROP_TDS, (generic_fp ) evalEXPR, (generic_fp ) - (generic_fp ) evalCMD_IF, (generic_fp ) evalMATCH_IF -}; - * */ - -Object **eval(Node *n, STable *scope, HeaderController *controllerSmv); -Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv); - STable* selectSMV_SCOPE(STable* scope, HeaderController* controllerSmv){ if(scope->type == FUNC || scope->childOfFunction){ return controllerSmv->functionsInfo[scope->order]; @@ -631,7 +600,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controlle void* vp[] = {ptitime}; updateValue("I_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",I_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,0,0); + updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,0,ptitime); // necessita atualizar C_TIME updateValue("C_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); } @@ -639,7 +608,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controlle void* vp[] = {ptftime}; updateValue("F_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",F_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,1,1); + updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,1,ptftime); } return NULL; } @@ -648,10 +617,8 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv { Object* expr = NULL; Object** sintExpr = NULL; - - // recuperação de diretiva temporal principal para uso TableEntry* ctimeEntry = lookup(scope, "C_TIME"); - int ctime = *(int*) ctimeEntry->val->values[0]; + int ctime = *(int*) ctimeEntry->val->values[0]; // recuperação de diretiva temporal principal para uso // caso de atribuição de diretiva if(n->children[0]->type == ASSIGN_TDIRECTIVE) @@ -662,9 +629,9 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv fprintf(stderr, "ERROR: BAD USE OF %s TIME DIRECTIVE, THE CONTEXT IS LOCKED! \n", n->children[0]->leafs[0]); exit(-1); } - // dois casos: alterar o valor na tabela de simbolos - //Mudou intervalos: alterar intervalo no main do SMV e mudar o init ou next (dependendo da diretiva) - //Mudou CONTEXTO (C_TIME) : seguir o caso default + // dois casos: alterar o valor na tabela de simbolo + // Mudou intervalos: alterar intervalo no main do SMV e mudar o init ou next (dependendo da diretiva) + // Mudou CONTEXTO (C_TIME) : seguir o caso default // objeto sintetizado (chamar fora ou dentro do if depois das validações? avisa erros mais rapido) sintExpr = eval(n->children[1], scope, controllerSmv); @@ -675,7 +642,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv exit(-1); } if(*(int*)expr->values[0] < ctime ){ - fprintf(stderr, "ERROR: BAD USE OF %s TIME DIRECTIVE, IMPOSSIBLE TO RETURN TO PAST CONTEXTS \n", n->children[0]->leafs[0]); + fprintf(stderr, "ERROR: BAD USE OF %s TIME DIRECTIVE, IMPOSSIBLE TO RETURN TO PREVIOUS TIME CONTEXTS \n", n->children[0]->leafs[0]); exit(-1); } // validaçao de intervalo @@ -703,14 +670,8 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv char* varName = n->children[0]->leafs[0]; TableEntry* varEntry = lookup(scope,varName); Object* var = varEntry == NULL ? NULL : varEntry->val; - int minmax = 0; - // tratamento do intervalo nuXmv de inteiros - if(var && expr->type == NUMBER_ENTRY){ - int old = *(int*)var->values[0]; - int new = *(int*)expr->values[0]; - minmax = new > old; - } - // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) + + // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) (foi separado em métodos //STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); STable* refAuxTable = selectSMV_SCOPE(scope,controllerSmv); HeaderSmv* refHeader = selectSMV_INFO(scope,expr->type == FUNCTION_ENTRY? expr : NULL,controllerSmv); @@ -738,15 +699,16 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv //inicialização "com next", necessita criar um default para os instantes anteriores e o seu next // note que temporal condition tem que ser um cubo de condição e tempo if(changeContext){ - specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, NULL, - 0, NULL, scope->order, scope->level, expr->type, 0, minmax); + specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, defaultValueBind, + 0, NULL, scope->order, scope->level, expr->type, 0, NULL); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - 0, NULL, scope->order, scope->level, expr->type, 1, 1); + 0, NULL, scope->order, scope->level, expr->type, 1, expr->values[0]); + } else{ // condition em INIT? e default, deve-se criar default tmb specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, defaultValueBind, - 0, NULL, scope->order, scope->level, expr->type, 0, 0); + 0, NULL, scope->order, scope->level, expr->type, 0, expr->values[0]); } } else{ @@ -758,22 +720,22 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv if(changeContext && var->redef == prevDef){ conditionCube = formatBinds(ctime,changeContext,defaultValueBind,valueBind,defaultValueBind,expr,scope, prevContext? 0 : 1); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 1, minmax); + var->redef, NULL, scope->order, scope->level, expr->type, 1, expr->values[0]); } else{ // tempo = 0, redefinição if(!changeContext){ conditionCube = formatBinds(ctime,changeContext,defaultValueBind,valueBind,defaultValueBind,expr,scope,1); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 0, minmax); + var->redef, NULL, scope->order, scope->level, expr->type, 0, expr->values[0]); } // tempo > 0 e redefinição else{ conditionCube = formatBinds(ctime,changeContext,defaultValueBind,valueBind,defaultValueBind,expr,scope,1); - specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 0, minmax); + specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, defaultValueBind, + var->redef, NULL, scope->order, scope->level, expr->type, 0, expr->values[0]); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 1, minmax); + var->redef, NULL, scope->order, scope->level, expr->type, 1, expr->values[0]); } } } diff --git a/src/PostProcess.c b/src/PostProcess.c index ed44d60..52601d8 100644 --- a/src/PostProcess.c +++ b/src/PostProcess.c @@ -128,22 +128,24 @@ char* formatBinds(int ctime, int changeContext, char* directiveValueBind, char* } -void createType(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, const char* newValue, int type) +void createType(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, const char *newValueBind, + const char *defaultValueBind, int type, void *newValue) { char* newType = malloc(sizeof(char)*ALOC_SIZE_LINE); if(type == NUMBER_ENTRY || type == T_DIRECTIVE_ENTRY){ - sprintf(newType,SmvConversions[INTERVAL_DEC],varName,newValue,newValue); + sprintf(newType, SmvConversions[INTERVAL_DEC], varName, newValueBind,newValueBind); char* auxDelim = strstr(newType,":"); char* auxFim = strstr(auxDelim,".."); int pointIni = (auxDelim-newType+2); int pointEnd = ((auxFim-newType))-1; int pos = header->VAR_POINTER; int tam = strlen(newType); - void* po[] = {&pos, &tam, &pointIni, &pointEnd}; - addValue(varName, po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable, 0); + int minmax = !defaultValueBind? *(int*) newValue : 0; + void* po[] = {&pos, &tam, &pointIni, &pointEnd,&minmax,&minmax}; + addValue(varName, po, WRITE_SMV_INFO, 6, 0, writeSmvTypeTable, 0); } if(type == LOGICAL_ENTRY){ - sprintf(newType,SmvConversions[BOOLEAN_DEC],varName,newValue,newValue); + sprintf(newType, SmvConversions[BOOLEAN_DEC], varName); int pos = header->VAR_POINTER; int tam = strlen(newType); void* po[] = {&pos, &tam}; @@ -159,7 +161,8 @@ void createType(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, con header->VAR_POINTER += 1; } -void updateType(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, const char* newValue, int type,int minmax) +void updateType(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, const char *newValueBind, int type, + void *newValue) { // começando com numérico x..y; // criar enum mapeador ao decorrer... @@ -169,35 +172,52 @@ void updateType(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, con int size; int pointIni; int pointEnd; + int min; + int max; + int minmax = -1; // recuperar da tabela TableEntry* entryPosType; entryPosType = lookup(writeSmvTypeTable,varName); if(entryPosType){ - pos = *(int*) entryPosType->val->values[0]; - size = *(int*) entryPosType->val->values[1]; - pointIni = *(int*) entryPosType->val->values[2]; - pointEnd = *(int*) entryPosType->val->values[3]; - - int newPointIni = 0; - int newPointEnd = 0; - int sizeNew = strlen(newValue); - // min..max; - if(minmax) - { - pointIni = pointEnd+3; // n..max; - // nota! o size já está indexbased! - pointEnd = header->varBuffer[pos][size-1] == '\n' ? size-3 : size-2; // max;\n (-1 do index based) - (-2 ou -1 dependendo do fim) - //size = header->varBuffer[pos][size-1] == '\n' ? size-1 : size; - } - updateSubStringInterval(newValue,header->varBuffer[pos],sizeNew,pointIni,pointEnd,size,&newPointIni,&newPointEnd); - size = -1*((pointEnd-pointIni+1) - sizeNew) + size; - void* vpSize[] = {&size}; - updateValue(varName, vpSize, WRITE_SMV_INFO, 1, 1, -1, writeSmvTypeTable, 0); - // atualizar o fim do intervalo não mudar a nossa variável pointEnd também! Só atualiza o tamanho - if(!minmax) - { - void* vpInEnd[] = {&newPointEnd}; - updateValue(varName, vpInEnd, WRITE_SMV_INFO, 1, 3, -1, writeSmvTypeTable, 0); + min = *(int*) entryPosType->val->values[4]; + max = *(int*) entryPosType->val->values[5]; + minmax = *(int*) newValue < min ? 0 : + *(int*) newValue > max ? 1 : minmax; + if(minmax != -1){ + pos = *(int*) entryPosType->val->values[0]; + size = *(int*) entryPosType->val->values[1]; + pointIni = *(int*) entryPosType->val->values[2]; + pointEnd = *(int*) entryPosType->val->values[3]; + + int newPointIni = 0; + int newPointEnd = 0; + int sizeNew = strlen(newValueBind); + // min..max; + if(minmax) + { + pointIni = pointEnd+3; // n..max; + // nota! o size já está indexbased! + pointEnd = header->varBuffer[pos][size-1] == '\n' ? size-3 : size-2; // max;\n (-1 do index based) - (-2 ou -1 dependendo do fim) + //size = header->varBuffer[pos][size-1] == '\n' ? size-1 : size; + } + updateSubStringInterval(newValueBind, header->varBuffer[pos], sizeNew, pointIni, pointEnd, size, &newPointIni, &newPointEnd); + size = -1*((pointEnd-pointIni+1) - sizeNew) + size; + void* vpSize[] = {&size}; + updateValue(varName, vpSize, WRITE_SMV_INFO, 1, 1, -1, writeSmvTypeTable, 0); + // atualizar o fim do intervalo não mudar a nossa variável pointEnd também! Só atualiza o tamanho + if(!minmax) + { + void* vpInEnd[] = {&newPointEnd}; + updateValue(varName, vpInEnd, WRITE_SMV_INFO, 1, 3, -1, writeSmvTypeTable, 0); + min = *(int*) newValue; + void* vpmin[] = {&min}; + updateValue(varName, vpmin, WRITE_SMV_INFO, 1, 4, -1, writeSmvTypeTable, 0); + } + else{ + max = *(int*) newValue; + void* vpmax[] = {&max}; + updateValue(varName, vpmax, WRITE_SMV_INFO, 1, 5, -1, writeSmvTypeTable, 0); + } } } else{ @@ -271,7 +291,7 @@ void createAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, c -void updateAssign(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, char* newValue, char* condition, int type ,int typeExpr, int minmax) +void updateAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, int type, int typeExpr) { // tratamento de init/next(varName):= case ... TRUE : x; esac; , geralmente TRUE: NULL ou outra condição parecida // é sempre o "delmitador final", vai ser um caso similar ao anterior porém entre ponto de interesse - condição default, já que condições não mudam! @@ -368,43 +388,46 @@ char* processActiveName(char* varName, char* funcRef, int redef, int level, int } return useVar; } - -void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, - char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, int minmax) +// passar o processo de bind aqui para dentro +void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValueBind, char *condition, + char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, + void *newValue) { char* useVar = NULL; // por default, usamos o nome da varável (se não for, em escopos diferentes ou ainda em redef ) char interScope[ALOC_SIZE_LINE]; //nome com info de scope char interRedef[ALOC_SIZE_LINE]; //nome com redefinição char statevarname[ALOC_SIZE_LINE]; // init ou next useVar = processActiveName(varName,funcRef,redef,level,order,interScope,interRedef); - // next if(typeExpr){ // criar init/next(useVar) sprintf(statevarname,SmvConversions[NEXT],useVar); //verifica se existe next(statevarname) - updateType(useVar,header,writeSmvTypeTable,newValue,type,minmax); + updateType(useVar, header, writeSmvTypeTable, newValueBind, type, newValue); if(lookup(writeSmvTypeTable,statevarname)){ - updateAssign(useVar,header,writeSmvTypeTable,newValue,condition,type,NEXT,minmax); + updateAssign(useVar, header, writeSmvTypeTable, newValueBind, condition, type, NEXT); } else{ - createAssign(useVar, header, writeSmvTypeTable, newValue, condition, NEXT, NULL); + createAssign(useVar, header, writeSmvTypeTable, newValueBind, condition, NEXT, NULL); } } // init else{ - createType(useVar,header,writeSmvTypeTable,newValue,type); - createAssign(useVar, header, writeSmvTypeTable, newValue, condition, INIT, defaultValue); + createType(useVar, header, writeSmvTypeTable, newValueBind, defaultValue, type, newValue); + createAssign(useVar, header, writeSmvTypeTable, newValueBind, condition, INIT, defaultValue); } } -void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValue, int type, int typeExpr, int minmax) +void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValueBind, int type, int typeExpr, int *newValue) { - updateType("time",main,writeSmvTypeTable,newValue,type,minmax); - typeExpr ? updateAssign("time",main,writeSmvTypeTable,newValue,NULL,type,NEXT,minmax) : - updateAssign("time",main,writeSmvTypeTable,newValue,NULL,type,INIT,minmax); + TableEntry* timeSmvInfo = lookup(writeSmvTypeTable,"time"); + updateType("time", main, writeSmvTypeTable, newValueBind, type, newValue); + typeExpr ? updateAssign("time", main, writeSmvTypeTable, newValueBind, NULL, type, NEXT) : + updateAssign("time", main, writeSmvTypeTable, newValueBind, NULL, type, INIT); } +// criar reset para variáveis +void createVarReset(char* varName, HeaderController* controller); void writeResultantHeaders(HeaderController* controller, const char* path){ diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index cc645d4..20d46f8 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -198,6 +198,9 @@ void letgoTable(STable *t) } free(t->tableData); } + if(t->conditionBind){ + free(t->conditionBind); + } free(t); } From 5f286457bca58a6d0166f8a04f563fa64578b06d Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Thu, 7 Jan 2021 01:16:51 -0300 Subject: [PATCH 15/30] =?UTF-8?q?Adicionando=20primeira=20vers=C3=A3od=20e?= =?UTF-8?q?=20header=20para=20generalizar=20executores=20de=20fun=C3=A7?= =?UTF-8?q?=C3=A3o=20no=20futuro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- headers/InterpreterEvals.h | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 headers/InterpreterEvals.h diff --git a/headers/InterpreterEvals.h b/headers/InterpreterEvals.h new file mode 100644 index 0000000..168c856 --- /dev/null +++ b/headers/InterpreterEvals.h @@ -0,0 +1,41 @@ +// +// Created by mateus on 06/01/2021. +// + +#ifndef TDSREPLANGUAGE_INTERPRETEREVALS_H +#define TDSREPLANGUAGE_INTERPRETEREVALS_H + + +// caso a gente queira simplificar os parâmetros (note que muitos são desnecessários em alguns evals (MELHORIA)) +//typedef Object* (*generic_fp)(void); +/* + * generic_fp executores[80] = { + + (generic_fp ) evalNUM, (generic_fp ) evalBOOL, (generic_fp ) evalSTRING, (generic_fp ) evalNULL, (generic_fp ) evalIDVAR, (generic_fp ) evalTIME_DIRECTIVE, + (generic_fp ) evalDataV, (generic_fp ) evalPARAMS_CALL, (generic_fp ) evalDEFINE_INTERVAL , (generic_fp ) evalAC_V, + (generic_fp ) evalOTHER_ASSIGN, (generic_fp ) evalV_PROP, (generic_fp ) evalADD_V, (generic_fp ) evalADD_V_PROP, (generic_fp ) evalV_PROP_TDS, (generic_fp ) evalEXPR, (generic_fp ) + (generic_fp ) evalCMD_IF, (generic_fp ) evalMATCH_IF +}; + * */ + +Object **eval(Node *n, STable *scope, HeaderController *controllerSmv); +Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv); + +#endif //TDSREPLANGUAGE_INTERPRETEREVALS_H From b1cc78acc9b2d66fac853a3b162b6bb2fe78171c Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:16:05 -0300 Subject: [PATCH 16/30] =?UTF-8?q?Revert=20"Adicionando=20primeira=20vers?= =?UTF-8?q?=C3=A3od=20e=20header=20para=20generalizar=20executores=20de=20?= =?UTF-8?q?fun=C3=A7=C3=A3o=20no=20futuro"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 5f286457bca58a6d0166f8a04f563fa64578b06d. --- headers/InterpreterEvals.h | 41 -------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 headers/InterpreterEvals.h diff --git a/headers/InterpreterEvals.h b/headers/InterpreterEvals.h deleted file mode 100644 index 168c856..0000000 --- a/headers/InterpreterEvals.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// Created by mateus on 06/01/2021. -// - -#ifndef TDSREPLANGUAGE_INTERPRETEREVALS_H -#define TDSREPLANGUAGE_INTERPRETEREVALS_H - - -// caso a gente queira simplificar os parâmetros (note que muitos são desnecessários em alguns evals (MELHORIA)) -//typedef Object* (*generic_fp)(void); -/* - * generic_fp executores[80] = { - - (generic_fp ) evalNUM, (generic_fp ) evalBOOL, (generic_fp ) evalSTRING, (generic_fp ) evalNULL, (generic_fp ) evalIDVAR, (generic_fp ) evalTIME_DIRECTIVE, - (generic_fp ) evalDataV, (generic_fp ) evalPARAMS_CALL, (generic_fp ) evalDEFINE_INTERVAL , (generic_fp ) evalAC_V, - (generic_fp ) evalOTHER_ASSIGN, (generic_fp ) evalV_PROP, (generic_fp ) evalADD_V, (generic_fp ) evalADD_V_PROP, (generic_fp ) evalV_PROP_TDS, (generic_fp ) evalEXPR, (generic_fp ) - (generic_fp ) evalCMD_IF, (generic_fp ) evalMATCH_IF -}; - * */ - -Object **eval(Node *n, STable *scope, HeaderController *controllerSmv); -Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv); - -#endif //TDSREPLANGUAGE_INTERPRETEREVALS_H From c47900ff86d537eb69fcceb0a447d760d4fc4660 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:17:10 -0300 Subject: [PATCH 17/30] =?UTF-8?q?Revert=20"Resolve=20#32=20e=20#43=20(falt?= =?UTF-8?q?a=20limpeza=20de=20c=C3=B3digo,=20e=20corrigir=20memory=20leak?= =?UTF-8?q?=20ao=20final=20do=20c=C3=B3digo)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fd687a09e4d2f99b141a835dba40cdc4bb1a1215. --- headers/HeaderSmv.h | 2 +- headers/PostProcess.h | 34 +++-------- src/Interpreter.c | 78 ++++++++++++++++++------- src/PostProcess.c | 113 ++++++++++++++---------------------- src/datastructures/STable.c | 3 - 5 files changed, 112 insertions(+), 118 deletions(-) diff --git a/headers/HeaderSmv.h b/headers/HeaderSmv.h index a19013e..f7d607c 100644 --- a/headers/HeaderSmv.h +++ b/headers/HeaderSmv.h @@ -2,7 +2,7 @@ #define HEADER_H -#include "STable.h" +#include #include "textManager.h" #include "Enum.h" diff --git a/headers/PostProcess.h b/headers/PostProcess.h index 0d46b98..2df3dc0 100644 --- a/headers/PostProcess.h +++ b/headers/PostProcess.h @@ -31,7 +31,7 @@ void copyValueBind(Object* o, char* bind,int index,int defaultValue); * o init(time) ou next(time) dependendo se for I_TIME ou F_TIME * */ -void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValueBind, int type, int typeExpr, int *newValue); +void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValue, int type, int typeExrp,int minmax); /** * Cria um cubo de condições da forma: @@ -58,27 +58,9 @@ void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValueBind * */ char *createConditionCube(char *opBind1, char *opBind2, char *operation, char *evaluation, int firstCond); -/** - * Cria um bind SMV partindo de uma expressão entre duas objetos componentes (que também podem ser expressões que já tem bind de expressão) - * @param result o ponteiro para - * @param o1 a primeira componente da expressão - * @param o2 a segunda componente da expressão - * @param op a operação que junta as componentes - * - * @SideEffects: Escreve a expressão no buffer result, isso evita um malloc e free atoa, já que essa string já será passada como parâmetro - * para o create Object (que vai fazer um malloc também). - * */ +/***/ void createExprBind(char *result, Object *o1, Object *o2, char *op); - -/** - * Associa uma condição (vinda de um objeto) a um escopo - * - * @param scope a tabela de simbolos corrente - * @param conditionExpr o objeto expressão - * - * @SideEffects: Associa o bind desse objeto ao escopo, alocando memória para essa condição - * - * */ +/***/ void bindCondition(STable* scope, Object* conditionExpr); /** @@ -144,17 +126,17 @@ void createAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, c * além disso, atualiza na entrada da tabela da simbolos o tipo (typeSet) associada a varName, * se o tipo mudar (caso de next após mudança de contexto). * */ -void updateAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, int type, - int typeExpr); +void updateAssign(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, char* newValue, char* condition, int type ,int typeExpr, int minmax); /** * Escolhe entre update/create Assign de casos init/next tratando casos de redefinição e condições * @param * @sideEffects: Todos os colaterais de updateAssign ou createAssign * */ -void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValueBind, char *condition, - char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, - void *newValue); +void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, + char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, int minmax); + + void writeResultantHeaders(HeaderController* controller, const char* path); diff --git a/src/Interpreter.c b/src/Interpreter.c index aa1aaa4..3b95eec 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -5,11 +5,42 @@ #include #include #include "../headers/PostProcess.h" -#include "../headers/InterpreterEvals.h" typedef enum MAP_OP { PLUS = 43, MINUS = 45, TIMES = 42, DIVIDE = 47, MOD = 37, LT = 60, GT = 62, NOTEQUAL = 94, NOT_PREFIX = 110, LE = 121, EQUAL = 122, GE = 123} MAP_OP; +// caso a gente queira simplificar os parâmetros (note que muitos são desnecessários em alguns evals (MELHORIA)) +//typedef Object* (*generic_fp)(void); +/* + * generic_fp executores[80] = { + + (generic_fp ) evalNUM, (generic_fp ) evalBOOL, (generic_fp ) evalSTRING, (generic_fp ) evalNULL, (generic_fp ) evalIDVAR, (generic_fp ) evalTIME_DIRECTIVE, + (generic_fp ) evalDataV, (generic_fp ) evalPARAMS_CALL, (generic_fp ) evalDEFINE_INTERVAL , (generic_fp ) evalAC_V, + (generic_fp ) evalOTHER_ASSIGN, (generic_fp ) evalV_PROP, (generic_fp ) evalADD_V, (generic_fp ) evalADD_V_PROP, (generic_fp ) evalV_PROP_TDS, (generic_fp ) evalEXPR, (generic_fp ) + (generic_fp ) evalCMD_IF, (generic_fp ) evalMATCH_IF +}; + * */ + +Object **eval(Node *n, STable *scope, HeaderController *controllerSmv); +Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv); +Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv); +Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv); + STable* selectSMV_SCOPE(STable* scope, HeaderController* controllerSmv){ if(scope->type == FUNC || scope->childOfFunction){ return controllerSmv->functionsInfo[scope->order]; @@ -600,7 +631,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controlle void* vp[] = {ptitime}; updateValue("I_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",I_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,0,ptitime); + updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,0,0); // necessita atualizar C_TIME updateValue("C_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); } @@ -608,7 +639,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controlle void* vp[] = {ptftime}; updateValue("F_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",F_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,1,ptftime); + updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,1,1); } return NULL; } @@ -617,8 +648,10 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv { Object* expr = NULL; Object** sintExpr = NULL; + + // recuperação de diretiva temporal principal para uso TableEntry* ctimeEntry = lookup(scope, "C_TIME"); - int ctime = *(int*) ctimeEntry->val->values[0]; // recuperação de diretiva temporal principal para uso + int ctime = *(int*) ctimeEntry->val->values[0]; // caso de atribuição de diretiva if(n->children[0]->type == ASSIGN_TDIRECTIVE) @@ -629,9 +662,9 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv fprintf(stderr, "ERROR: BAD USE OF %s TIME DIRECTIVE, THE CONTEXT IS LOCKED! \n", n->children[0]->leafs[0]); exit(-1); } - // dois casos: alterar o valor na tabela de simbolo - // Mudou intervalos: alterar intervalo no main do SMV e mudar o init ou next (dependendo da diretiva) - // Mudou CONTEXTO (C_TIME) : seguir o caso default + // dois casos: alterar o valor na tabela de simbolos + //Mudou intervalos: alterar intervalo no main do SMV e mudar o init ou next (dependendo da diretiva) + //Mudou CONTEXTO (C_TIME) : seguir o caso default // objeto sintetizado (chamar fora ou dentro do if depois das validações? avisa erros mais rapido) sintExpr = eval(n->children[1], scope, controllerSmv); @@ -642,7 +675,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv exit(-1); } if(*(int*)expr->values[0] < ctime ){ - fprintf(stderr, "ERROR: BAD USE OF %s TIME DIRECTIVE, IMPOSSIBLE TO RETURN TO PREVIOUS TIME CONTEXTS \n", n->children[0]->leafs[0]); + fprintf(stderr, "ERROR: BAD USE OF %s TIME DIRECTIVE, IMPOSSIBLE TO RETURN TO PAST CONTEXTS \n", n->children[0]->leafs[0]); exit(-1); } // validaçao de intervalo @@ -670,8 +703,14 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv char* varName = n->children[0]->leafs[0]; TableEntry* varEntry = lookup(scope,varName); Object* var = varEntry == NULL ? NULL : varEntry->val; - - // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) (foi separado em métodos + int minmax = 0; + // tratamento do intervalo nuXmv de inteiros + if(var && expr->type == NUMBER_ENTRY){ + int old = *(int*)var->values[0]; + int new = *(int*)expr->values[0]; + minmax = new > old; + } + // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) //STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); STable* refAuxTable = selectSMV_SCOPE(scope,controllerSmv); HeaderSmv* refHeader = selectSMV_INFO(scope,expr->type == FUNCTION_ENTRY? expr : NULL,controllerSmv); @@ -699,16 +738,15 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv //inicialização "com next", necessita criar um default para os instantes anteriores e o seu next // note que temporal condition tem que ser um cubo de condição e tempo if(changeContext){ - specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, defaultValueBind, - 0, NULL, scope->order, scope->level, expr->type, 0, NULL); + specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, NULL, + 0, NULL, scope->order, scope->level, expr->type, 0, minmax); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - 0, NULL, scope->order, scope->level, expr->type, 1, expr->values[0]); - + 0, NULL, scope->order, scope->level, expr->type, 1, 1); } else{ // condition em INIT? e default, deve-se criar default tmb specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, defaultValueBind, - 0, NULL, scope->order, scope->level, expr->type, 0, expr->values[0]); + 0, NULL, scope->order, scope->level, expr->type, 0, 0); } } else{ @@ -720,22 +758,22 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv if(changeContext && var->redef == prevDef){ conditionCube = formatBinds(ctime,changeContext,defaultValueBind,valueBind,defaultValueBind,expr,scope, prevContext? 0 : 1); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 1, expr->values[0]); + var->redef, NULL, scope->order, scope->level, expr->type, 1, minmax); } else{ // tempo = 0, redefinição if(!changeContext){ conditionCube = formatBinds(ctime,changeContext,defaultValueBind,valueBind,defaultValueBind,expr,scope,1); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 0, expr->values[0]); + var->redef, NULL, scope->order, scope->level, expr->type, 0, minmax); } // tempo > 0 e redefinição else{ conditionCube = formatBinds(ctime,changeContext,defaultValueBind,valueBind,defaultValueBind,expr,scope,1); - specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, defaultValueBind, - var->redef, NULL, scope->order, scope->level, expr->type, 0, expr->values[0]); + specAssign(varName, refHeader, refAuxTable, defaultValueBind, NULL, NULL, + var->redef, NULL, scope->order, scope->level, expr->type, 0, minmax); specAssign(varName, refHeader, refAuxTable, valueBind, conditionCube, NULL, - var->redef, NULL, scope->order, scope->level, expr->type, 1, expr->values[0]); + var->redef, NULL, scope->order, scope->level, expr->type, 1, minmax); } } } diff --git a/src/PostProcess.c b/src/PostProcess.c index 52601d8..ed44d60 100644 --- a/src/PostProcess.c +++ b/src/PostProcess.c @@ -128,24 +128,22 @@ char* formatBinds(int ctime, int changeContext, char* directiveValueBind, char* } -void createType(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, const char *newValueBind, - const char *defaultValueBind, int type, void *newValue) +void createType(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, const char* newValue, int type) { char* newType = malloc(sizeof(char)*ALOC_SIZE_LINE); if(type == NUMBER_ENTRY || type == T_DIRECTIVE_ENTRY){ - sprintf(newType, SmvConversions[INTERVAL_DEC], varName, newValueBind,newValueBind); + sprintf(newType,SmvConversions[INTERVAL_DEC],varName,newValue,newValue); char* auxDelim = strstr(newType,":"); char* auxFim = strstr(auxDelim,".."); int pointIni = (auxDelim-newType+2); int pointEnd = ((auxFim-newType))-1; int pos = header->VAR_POINTER; int tam = strlen(newType); - int minmax = !defaultValueBind? *(int*) newValue : 0; - void* po[] = {&pos, &tam, &pointIni, &pointEnd,&minmax,&minmax}; - addValue(varName, po, WRITE_SMV_INFO, 6, 0, writeSmvTypeTable, 0); + void* po[] = {&pos, &tam, &pointIni, &pointEnd}; + addValue(varName, po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable, 0); } if(type == LOGICAL_ENTRY){ - sprintf(newType, SmvConversions[BOOLEAN_DEC], varName); + sprintf(newType,SmvConversions[BOOLEAN_DEC],varName,newValue,newValue); int pos = header->VAR_POINTER; int tam = strlen(newType); void* po[] = {&pos, &tam}; @@ -161,8 +159,7 @@ void createType(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, con header->VAR_POINTER += 1; } -void updateType(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, const char *newValueBind, int type, - void *newValue) +void updateType(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, const char* newValue, int type,int minmax) { // começando com numérico x..y; // criar enum mapeador ao decorrer... @@ -172,52 +169,35 @@ void updateType(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, con int size; int pointIni; int pointEnd; - int min; - int max; - int minmax = -1; // recuperar da tabela TableEntry* entryPosType; entryPosType = lookup(writeSmvTypeTable,varName); if(entryPosType){ - min = *(int*) entryPosType->val->values[4]; - max = *(int*) entryPosType->val->values[5]; - minmax = *(int*) newValue < min ? 0 : - *(int*) newValue > max ? 1 : minmax; - if(minmax != -1){ - pos = *(int*) entryPosType->val->values[0]; - size = *(int*) entryPosType->val->values[1]; - pointIni = *(int*) entryPosType->val->values[2]; - pointEnd = *(int*) entryPosType->val->values[3]; - - int newPointIni = 0; - int newPointEnd = 0; - int sizeNew = strlen(newValueBind); - // min..max; - if(minmax) - { - pointIni = pointEnd+3; // n..max; - // nota! o size já está indexbased! - pointEnd = header->varBuffer[pos][size-1] == '\n' ? size-3 : size-2; // max;\n (-1 do index based) - (-2 ou -1 dependendo do fim) - //size = header->varBuffer[pos][size-1] == '\n' ? size-1 : size; - } - updateSubStringInterval(newValueBind, header->varBuffer[pos], sizeNew, pointIni, pointEnd, size, &newPointIni, &newPointEnd); - size = -1*((pointEnd-pointIni+1) - sizeNew) + size; - void* vpSize[] = {&size}; - updateValue(varName, vpSize, WRITE_SMV_INFO, 1, 1, -1, writeSmvTypeTable, 0); - // atualizar o fim do intervalo não mudar a nossa variável pointEnd também! Só atualiza o tamanho - if(!minmax) - { - void* vpInEnd[] = {&newPointEnd}; - updateValue(varName, vpInEnd, WRITE_SMV_INFO, 1, 3, -1, writeSmvTypeTable, 0); - min = *(int*) newValue; - void* vpmin[] = {&min}; - updateValue(varName, vpmin, WRITE_SMV_INFO, 1, 4, -1, writeSmvTypeTable, 0); - } - else{ - max = *(int*) newValue; - void* vpmax[] = {&max}; - updateValue(varName, vpmax, WRITE_SMV_INFO, 1, 5, -1, writeSmvTypeTable, 0); - } + pos = *(int*) entryPosType->val->values[0]; + size = *(int*) entryPosType->val->values[1]; + pointIni = *(int*) entryPosType->val->values[2]; + pointEnd = *(int*) entryPosType->val->values[3]; + + int newPointIni = 0; + int newPointEnd = 0; + int sizeNew = strlen(newValue); + // min..max; + if(minmax) + { + pointIni = pointEnd+3; // n..max; + // nota! o size já está indexbased! + pointEnd = header->varBuffer[pos][size-1] == '\n' ? size-3 : size-2; // max;\n (-1 do index based) - (-2 ou -1 dependendo do fim) + //size = header->varBuffer[pos][size-1] == '\n' ? size-1 : size; + } + updateSubStringInterval(newValue,header->varBuffer[pos],sizeNew,pointIni,pointEnd,size,&newPointIni,&newPointEnd); + size = -1*((pointEnd-pointIni+1) - sizeNew) + size; + void* vpSize[] = {&size}; + updateValue(varName, vpSize, WRITE_SMV_INFO, 1, 1, -1, writeSmvTypeTable, 0); + // atualizar o fim do intervalo não mudar a nossa variável pointEnd também! Só atualiza o tamanho + if(!minmax) + { + void* vpInEnd[] = {&newPointEnd}; + updateValue(varName, vpInEnd, WRITE_SMV_INFO, 1, 3, -1, writeSmvTypeTable, 0); } } else{ @@ -291,7 +271,7 @@ void createAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, c -void updateAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, int type, int typeExpr) +void updateAssign(char* varName ,HeaderSmv* header, STable* writeSmvTypeTable, char* newValue, char* condition, int type ,int typeExpr, int minmax) { // tratamento de init/next(varName):= case ... TRUE : x; esac; , geralmente TRUE: NULL ou outra condição parecida // é sempre o "delmitador final", vai ser um caso similar ao anterior porém entre ponto de interesse - condição default, já que condições não mudam! @@ -388,46 +368,43 @@ char* processActiveName(char* varName, char* funcRef, int redef, int level, int } return useVar; } -// passar o processo de bind aqui para dentro -void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValueBind, char *condition, - char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, - void *newValue) + +void specAssign(char *varName, HeaderSmv *header, STable *writeSmvTypeTable, char *newValue, char *condition, + char *defaultValue, int redef, char *funcRef, int order, int level, int type, int typeExpr, int minmax) { char* useVar = NULL; // por default, usamos o nome da varável (se não for, em escopos diferentes ou ainda em redef ) char interScope[ALOC_SIZE_LINE]; //nome com info de scope char interRedef[ALOC_SIZE_LINE]; //nome com redefinição char statevarname[ALOC_SIZE_LINE]; // init ou next useVar = processActiveName(varName,funcRef,redef,level,order,interScope,interRedef); + // next if(typeExpr){ // criar init/next(useVar) sprintf(statevarname,SmvConversions[NEXT],useVar); //verifica se existe next(statevarname) - updateType(useVar, header, writeSmvTypeTable, newValueBind, type, newValue); + updateType(useVar,header,writeSmvTypeTable,newValue,type,minmax); if(lookup(writeSmvTypeTable,statevarname)){ - updateAssign(useVar, header, writeSmvTypeTable, newValueBind, condition, type, NEXT); + updateAssign(useVar,header,writeSmvTypeTable,newValue,condition,type,NEXT,minmax); } else{ - createAssign(useVar, header, writeSmvTypeTable, newValueBind, condition, NEXT, NULL); + createAssign(useVar, header, writeSmvTypeTable, newValue, condition, NEXT, NULL); } } // init else{ - createType(useVar, header, writeSmvTypeTable, newValueBind, defaultValue, type, newValue); - createAssign(useVar, header, writeSmvTypeTable, newValueBind, condition, INIT, defaultValue); + createType(useVar,header,writeSmvTypeTable,newValue,type); + createAssign(useVar, header, writeSmvTypeTable, newValue, condition, INIT, defaultValue); } } -void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValueBind, int type, int typeExpr, int *newValue) +void updateTime(HeaderSmv* main , STable * writeSmvTypeTable, char* newValue, int type, int typeExpr, int minmax) { - TableEntry* timeSmvInfo = lookup(writeSmvTypeTable,"time"); - updateType("time", main, writeSmvTypeTable, newValueBind, type, newValue); - typeExpr ? updateAssign("time", main, writeSmvTypeTable, newValueBind, NULL, type, NEXT) : - updateAssign("time", main, writeSmvTypeTable, newValueBind, NULL, type, INIT); + updateType("time",main,writeSmvTypeTable,newValue,type,minmax); + typeExpr ? updateAssign("time",main,writeSmvTypeTable,newValue,NULL,type,NEXT,minmax) : + updateAssign("time",main,writeSmvTypeTable,newValue,NULL,type,INIT,minmax); } -// criar reset para variáveis -void createVarReset(char* varName, HeaderController* controller); void writeResultantHeaders(HeaderController* controller, const char* path){ diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index 20d46f8..cc645d4 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -198,9 +198,6 @@ void letgoTable(STable *t) } free(t->tableData); } - if(t->conditionBind){ - free(t->conditionBind); - } free(t); } From 3963642bbfbd310492e55e15354c47482484ec36 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:17:23 -0300 Subject: [PATCH 18/30] Revert "Adicionando alternativo smv" This reverts commit cd5b1ae8c3797f047963c6e11caa403d27830b15. --- sample/merger-fifo/merger-fifoModule.smv | 140 ----------------------- 1 file changed, 140 deletions(-) delete mode 100644 sample/merger-fifo/merger-fifoModule.smv diff --git a/sample/merger-fifo/merger-fifoModule.smv b/sample/merger-fifo/merger-fifoModule.smv deleted file mode 100644 index 8aa3288..0000000 --- a/sample/merger-fifo/merger-fifoModule.smv +++ /dev/null @@ -1,140 +0,0 @@ -MODULE main - -IVAR - defineModo : boolean; -- só pode ser usado em next's... perde parte da utilidade - -VAR - time : 0..6; - -- time : integer; não podemos fazer nada assim porque o modelChecker fica limitado, considerando que BDD não pode ser usado! - modoEntrada : boolean; - enumerado: {OCUPADO}; - automata : finalAutomata(time,modoEntrada); - -ASSIGN - init(time) := 0; - init(modoEntrada):= FALSE; - -- não podemos usar input vars porque elas possuem sérias limitações nos assigns - next(time) := case - time = 6 : 0; - TRUE : time + 1; - esac; - next(modoEntrada) := case - next(time) = 2 & defineModo: TRUE; - time = 6 : FALSE; - TRUE : modoEntrada; - esac; - -CTLSPEC AG( ( automata.ports.a.value != NULL & automata.ports.b.value = NULL) - |(automata.ports.a.value = NULL & automata.ports.b.value != NULL) - | (automata.ports.a.value = NULL & automata.ports.b.value = NULL)) ; - -MODULE portsModule(time,modoEntrada) -VAR --- a: {0, 1, NULL}; --- b: {0, 1, 4,5,6,7,8, NULL}; --- balt: {1}; --- c: {NULL, 0, 1, 5,7,6,9,8,10, 4}; --- d: {NULL, 0, 1, 5,7,6,9,8,10, 4}; --- invertScopeB : boolean; - a: tds_a(time); - b: tds_b(time,modoEntrada); - c: port_c(time); - d: port_d(time); --- c: {NULL, 0, 1}; --- d: {NULL, 0, 1}; -ASSIGN - - init(c.value):= case - a.value = NULL : b.value; - b.value = NULL : a.value; - TRUE : NULL ; - esac; - init(d.value):= NULL; - - - next(c.value):= - case - next(a.value) = NULL : next(b.value); - next(b.value) = NULL : next(a.value); - TRUE : NULL ; - esac; - - next(d.value):= case - d.value = NULL : c.value; - c.value = NULL & d.value != NULL : NULL; - TRUE : d.value; - esac; - - -MODULE tds_a(time) - VAR - value: {0, 1, NULL}; - ASSIGN - - init(value):= 0; - next(value):= - case - next(time) = 1 : 1; - next(time) = 2 : 0; - next(time) = 0 : 0; --reset para valor init - TRUE : NULL; - esac; - -MODULE tds_b(time,modoEntrada) - VAR - value: {0, 1, NULL}; - invert : boolean; - ASSIGN - init(invert) := !modoEntrada; - next(invert) := !next(modoEntrada); - - init(value):= NULL; - next(value):= case - next(time) = 0 | next(time) < 2: NULL; - !invert & next(time) != 6 : next(time) mod 2; - TRUE : NULL; - esac; - - -MODULE port_c(time) - VAR - value: {0, 1, NULL}; - ASSIGN - -MODULE port_d(time) - VAR - value: {0, 1, NULL}; - ASSIGN - - - - -MODULE finalAutomata(time, modoEntrada) - VAR - cs : {q0q0, p0q0, p1q0}; - ports : portsModule(time,modoEntrada); - ASSIGN - init(cs) := {q0q0}; -TRANS - ( (cs = q0q0 & ports.b.value = NULL & ports.c.value != NULL & ports.a.value = ports.c.value - & ports.d.value = NULL & ports.c.value = 0 ) -> next(cs) = p0q0 ) & - - ( (cs = q0q0 & ports.a.value = NULL & ports.c.value != NULL & ports.b.value = ports.c.value - & ports.d.value = NULL & ports.c.value = 0 ) -> next(cs) = p0q0 ) & - - ( (cs = q0q0 & ports.b.value = NULL & ports.c.value != NULL & ports.a.value = ports.c.value - & ports.d.value = NULL & ports.c.value = 1 ) -> next(cs) = p1q0 ) & - - ( (cs = q0q0 & ports.a.value = NULL & ports.c.value != NULL & ports.b.value = ports.c.value - & ports.d.value = NULL & ports.c.value = 1 ) -> next(cs) = p1q0 ) & - - ( (cs = p0q0 & ports.c.value = NULL & ports.d.value = 0 ) -> next(cs) = q0q0 ) & - - ( (cs = p0q0) -> ( (next(cs) != p1q0 ) ) ) & - - ( (cs = p1q0 & ports.c.value = NULL & ports.d.value = 1 ) -> next(cs) = q0q0 ) & - - ( (cs = p1q0) -> ( (next(cs) != p0q0 ) ) ) - - - From 616ce5a9f99a13e34308e9e0f4bfe6cd8099e8e2 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:17:32 -0300 Subject: [PATCH 19/30] =?UTF-8?q?Revert=20"Adicionando=20newSmvfile=20como?= =?UTF-8?q?=20demonstra=C3=A7=C3=A3o"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 33070a4a0a74a131afd4d378a73ffe7849f2b4e7. --- results/newSmvfile.smv | 98 ------------------------------------------ 1 file changed, 98 deletions(-) delete mode 100644 results/newSmvfile.smv diff --git a/results/newSmvfile.smv b/results/newSmvfile.smv deleted file mode 100644 index 40cbdd4..0000000 --- a/results/newSmvfile.smv +++ /dev/null @@ -1,98 +0,0 @@ -MODULE main -VAR - time: 0..20; - finalAutomata: finalAutomata(time); - x : 2..2; - x_redef1 : 4..30; - z : boolean; - w_scope1_0 : 1..1; - x_redef2 : 0..90; - y : 0..1; - w_scope1_1 : 0..1; -ASSIGN - init(time) := 0; - next(time) := case - time < 20: time + 1; - TRUE: time; -esac; - init(x):= 2; - init(x_redef1):= 30; - init(z):= FALSE; - init(w_scope1_0):= case - !z : 1; - TRUE : 0; - esac; - next(x_redef1):= case - next(time) = 2 : 4; - TRUE : x_redef1; - esac; - init(x_redef2):= 0; - next(x_redef2):= case - next(time) = 2 : 90; - TRUE : x_redef2; - esac; - init(y):= 0; - next(y):= case - next(time) = 2 : 1; - TRUE : y; - esac; - next(z):= case - next(time) = 3 : FALSE; - TRUE : z; - esac; - init(w_scope1_1):= 0; - next(w_scope1_1):= case - next(time) = 3 & !z : 1; - TRUE : w_scope1_1; - esac; - -MODULE merger1(time) -VAR - ports: portsModule(time); - cs: {q0}; -TRANS - ((cs = q0 & ports.b = NULL & ports.d = NULL & ports.c != NULL & ports.a = ports.c & FALSE) -> next(cs) = q0) & - ((cs = q0 & ports.a = NULL & ports.d = NULL & ports.c != NULL & ports.b = ports.c & FALSE) -> next(cs) = q0); - -MODULE fifo2(time) -VAR - ports: portsModule(time); - cs: {q0,p0,p1}; -ASSIGN - init(cs) := {q0}; -TRANS - ((cs = q0 & ports.a = NULL & ports.b = NULL & ports.d = NULL & ports.c = 0 & FALSE) -> next(cs) = p0) & - ((cs = q0 & ports.a = NULL & ports.b = NULL & ports.d = NULL & ports.c = 1 & FALSE) -> next(cs) = p1) & - ((cs = p0 & ports.a = NULL & ports.c = NULL & ports.b = NULL & ports.d = 0) -> next(cs) = q0) & - ((cs = p0) -> ((next(cs) != p1))) & - ((cs = p1 & ports.a = NULL & ports.c = NULL & ports.b = NULL & ports.d = 1) -> next(cs) = q0) & - ((cs = p1) -> ((next(cs) != p0))); - -MODULE finalAutomata(time) -VAR - prod1: merger1(time); - prod2: fifo2(time); - ports: portsModule(time); - cs: {q0q0,q0p0,q0p1}; -ASSIGN - init(cs) := {q0q0}; -TRANS - ((cs = q0q0 & ports.b = NULL & ports.d = NULL & ports.c != NULL & ports.a = ports.c & ports.c = 0) -> next(cs) = q0p0) & - ((cs = q0q0 & ports.b = NULL & ports.d = NULL & ports.c != NULL & ports.a = ports.c & ports.c = 1) -> next(cs) = q0p1) & - ((cs = q0q0 & ports.a = NULL & ports.d = NULL & ports.c != NULL & ports.b = ports.c & ports.c = 0) -> next(cs) = q0p0) & - ((cs = q0q0 & ports.a = NULL & ports.d = NULL & ports.c != NULL & ports.b = ports.c & ports.c = 1) -> next(cs) = q0p1) & - ((cs = q0p0) -> ((next(cs) != q0p1))) & - ((cs = q0p1) -> ((next(cs) != q0p0))); -INVAR - (((prod1.cs = q0) & (prod2.cs = q0)) <-> (cs = q0q0)) & - (((prod1.cs = q0) & (prod2.cs = p0)) <-> (cs = q0p0)) & - (((prod1.cs = q0) & (prod2.cs = p1)) <-> (cs = q0p1)); - -MODULE portsModule(time) -VAR - a : array 0..5 of {NULL, 0, 1}; - c : array 0..5 of {NULL, 0, 1}; - b : array 0..5 of {NULL, 0, 1}; - d : array 0..5 of {NULL, 0, 1}; -ASSIGN - From 21b81974b804d6d740339dcbebe813dcd5d723ea Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:17:41 -0300 Subject: [PATCH 20/30] =?UTF-8?q?Revert=20"Corrigindo=20segfault=20ao=20te?= =?UTF-8?q?ntar=20referenciar=20escopo=20pai,=20note=20que=20ainda=20temos?= =?UTF-8?q?=20um=20erro=20da=20reformula=C3=A7=C3=A3o=20do=20pr=C3=A9=20pr?= =?UTF-8?q?ocessamento=20e=20temos=20que=20terminar=20o=20tratamento=20de?= =?UTF-8?q?=20inteiros=20(#43,#44,#45)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit b71e54cb2212a9c4eaa805e5dcb74bc94ac98c7a. --- src/PreProcess.c | 2 ++ src/datastructures/HeaderSmv.c | 8 ++++---- src/datastructures/STable.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index 9353158..cbcb6f4 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -313,4 +313,6 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { free(buffer); //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); +// addParamToPortsModule(Hcontrol, "random", 0); +// addParamToPortsModule(Hcontrol, "testandoDnovo", 0); } \ No newline at end of file diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index 78dac8e..1354137 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -286,12 +286,12 @@ void addNewHeader(HeaderController* controller, HeaderSmv* newHeader){ } } -void propagParamDependence(HeaderSmv **headers, char *param, int sizeHeaders, smvtype type, int first) { +void propagParamDependence(HeaderSmv **headers, char *param, int sizeHeaders, smvtype type) { int i; char* refOldName; char* refOldPt; for(i = 0; i < sizeHeaders; i++){ - if(!first && type != MAIN){ + if(type != MAIN){ refOldName = headers[i]->moduleName; char* newName = addParams(refOldName,param,"(",")"); free(refOldName); @@ -312,9 +312,9 @@ void addParamToPortsModule(HeaderController *controller, char *param, int first) updated->moduleName = newName; // agora deve propagar as alterações para todos os demais módulos if(!first){ - propagParamDependence(controller->MAIN_RELATED, param, controller->H_MAIN_CURRENT_SIZE, MAIN, first); + propagParamDependence(controller->MAIN_RELATED, param, controller->H_MAIN_CURRENT_SIZE, MAIN); } - propagParamDependence(controller->AUTOMATA_RELATED, param, controller->H_AUTOMATA_CURRENT_SIZE, AUTOMATA, first); + propagParamDependence(controller->AUTOMATA_RELATED, param, controller->H_AUTOMATA_CURRENT_SIZE, AUTOMATA); } diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index cc645d4..aa3460b 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -104,7 +104,7 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { newtable->conditionBind = NULL; newtable->children = NULL; newtable->parent = parent; - newtable->childOfFunction = parent && (parent->type == FUNC || parent->childOfFunction); + newtable->childOfFunction = parent->type == FUNC || parent->childOfFunction; /* if(chillist){ From babcbaf430547e7d5fe6a1d8c0b1cef1a915aa0e Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:17:57 -0300 Subject: [PATCH 21/30] Revert "Atualizando exemplo" This reverts commit 4b46cf246339070173d35fd7fd1b20156bb70f91. --- sample/basic-main/basic.tds | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/sample/basic-main/basic.tds b/sample/basic-main/basic.tds index f19343a..6db0358 100644 --- a/sample/basic-main/basic.tds +++ b/sample/basic-main/basic.tds @@ -1,38 +1,25 @@ INTERVAL: 0 ~ 20 -x = 2 //redef =0 , context =0 -// usei aqui o x -x = 30 //redef =1 , context =0 -// usei redef1 -//z = true +x = 1 -z = false // ERRO -> corrigido +y = 30 -if(not z){ - w = 1 -} +x = 20 C_TIME = 2 -x = 4 //redef =1 , context =2 -// estamos em time =2 e referenciamos redef1 -// fizemos várias operações que nem a de C_TIME = 3 ... (que geraria colisão = atualiza a condição anterior) -C_TIME = 2 -x = 90 //redef =1 , context =2 // erro (caso de , variavel foi redefinida em time > 0)(unico que não funciona ainda) -y = 1 // e se esse y depender de x? ele vai estar olhando agora o x =5! NÃO O IGUAL A 4... +x = 3 +x= 4 C_TIME = 3 -x = 80 // // usa redef(next) anterior , context =3 -// e como vamos lidar com INVAR? (a pensar ainda...? Criar um buffer invar! E escrever em ordem no final!, "utilidade") +y = 0 -z = false // ERRO -> corrigido +x = 80 -if(not z){ - w = 1 -} +//condicaoTeste = true From 052772f2b3db78fcb9b71fe61e0f4533a54a69cd Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:05 -0300 Subject: [PATCH 22/30] =?UTF-8?q?Revert=20"Refletindo=20mudan=C3=A7as=20do?= =?UTF-8?q?=20pr=C3=A9=20processamento=20e=20Preparando=20para=20tratament?= =?UTF-8?q?o=20de=20fun=C3=A7=C3=B5es(#43,#44,#45,#48)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2d2cbfcd0e1369dee7686cf7f5936e9cb2982ba3. --- headers/HeaderSmv.h | 3 +- headers/Interpreter.h | 2 +- src/Interpreter.c | 144 +++++++++++++-------------------- src/datastructures/HeaderSmv.c | 4 +- 4 files changed, 61 insertions(+), 92 deletions(-) diff --git a/headers/HeaderSmv.h b/headers/HeaderSmv.h index f7d607c..41c523b 100644 --- a/headers/HeaderSmv.h +++ b/headers/HeaderSmv.h @@ -38,10 +38,9 @@ typedef struct headerController int declaredPorts; STable* mainInfo; STable* portsInfo; - STable** functionsInfo; //int CURRENT_SIZE; // usar current size com -1 (se vc está processando o indice atual(ultimo) é porque ele já alocou para o seguinte!) // ex: sétimo membro(6) (CURRENT_SIZE = 7) (ou seja para referenciar o último é só pegar CURRENT-1) - + }HeaderController; HeaderController *createController(); diff --git a/headers/Interpreter.h b/headers/Interpreter.h index 861951a..82ba6ac 100644 --- a/headers/Interpreter.h +++ b/headers/Interpreter.h @@ -12,7 +12,7 @@ #include "Node.h" #include "Object.h" -Object *eval(Node *n, STable *scope, HeaderController *controllerSmv); +Object * eval(Node* node, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); #endif diff --git a/src/Interpreter.c b/src/Interpreter.c index 3b95eec..0946ab6 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -21,61 +21,34 @@ typedef enum MAP_OP { PLUS = 43, MINUS = 45, TIMES = 42, DIVIDE = 47, MOD = 37, }; * */ -Object **eval(Node *n, STable *scope, HeaderController *controllerSmv); -Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv); -Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv); -Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv); - -STable* selectSMV_SCOPE(STable* scope, HeaderController* controllerSmv){ - if(scope->type == FUNC || scope->childOfFunction){ - return controllerSmv->functionsInfo[scope->order]; - } - else{ - return controllerSmv->mainInfo; // só vai retornar ports em casos de declarações de tds - } -} - -HeaderSmv * selectSMV_INFO(STable* scope, Object* functionPointer,HeaderController* controllerSmv){ - if(!functionPointer){ - return controllerSmv->MAIN_RELATED[0]; - } - else{ - int ALL_FUNCTION = *(int*) functionPointer->values[3]; -// int TDS_FUNCTION = *(int*) functionPointer->values[4]; - if(ALL_FUNCTION){ - return accessHeader(controllerSmv,MAIN,ALL_FUNCTION); - } -// if(TDS_FUNCTION){ -// return accessHeader(controllerSmv,PORTS,TDS_FUNCTION); -// } - fprintf(stderr, "FUNCTION SMV INFO NOT FOUND"); - exit(-1); - } -} - -Object* (*executores[80]) (Node* n, STable* scope, HeaderController* controllerSmv) = { +Object ** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalSTRING(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalNULL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalIDVAR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalTIME_DIRECTIVE(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalDataV(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalPARAMS_CALL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalAC_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalV_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalADD_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalADD_V_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object* evalV_PROP_TDS(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object * evalEXPR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object * evalCMD_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); +Object * evalMATCH_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); + +Object* (*executores[80]) (Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) = { evalNUM, evalBOOL, evalSTRING, evalNULL, evalIDVAR, evalTIME_DIRECTIVE, evalDataV, evalPARAMS_CALL, evalDEFINE_INTERVAL ,evalAC_V, evalOTHER_ASSIGN, evalV_PROP, evalADD_V, evalADD_V_PROP, evalV_PROP_TDS, evalEXPR, evalCMD_IF, evalMATCH_IF }; -Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { int sint; sint = atoi(n->leafs[0]); @@ -85,7 +58,7 @@ Object* evalNUM(Node* n, STable* scope, HeaderController* controllerSmv) return o; } -Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalBOOL] \n"); int sint; @@ -104,7 +77,7 @@ Object* evalBOOL(Node* n, STable* scope, HeaderController* controllerSmv) } -Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalSTRING(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalSTRING] \n"); char* sint = n->leafs[0]; @@ -124,7 +97,7 @@ Object* evalSTRING(Node* n, STable* scope, HeaderController* controllerSmv) */ -Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalNULL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalNULL] \n"); // se eu interpretar como "NULL" do C mesmo podemos ter problemas(?) @@ -140,7 +113,7 @@ Object* evalNULL(Node* n, STable* scope, HeaderController* controllerSmv) } -Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalIDVAR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalIDVAR] \n"); @@ -184,7 +157,7 @@ Object* evalIDVAR(Node* n, STable* scope, HeaderController* controllerSmv) } -Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalTIME_DIRECTIVE(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalTIME_DIRECTIVE] \n"); @@ -205,7 +178,7 @@ Object* evalTIME_DIRECTIVE(Node* n, STable* scope, HeaderController* controllerS -Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalDataV(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalDataV] \n"); @@ -221,7 +194,7 @@ Object* evalDataV(Node* n, STable* scope, HeaderController* controllerSmv) // vai chamar evalParams , e sintetizar um Object Vetor (ou um vetor void que será jogado em um object) } -Object* evalPARAMS_CALL(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalPARAMS_CALL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalPARAMS_CALL] \n"); } @@ -376,14 +349,14 @@ Object* evalEqual(Object* o1, Object* o2, int opCode) -Object* evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalEXPR(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalEXPR] \n"); // operação unária ou simplesmente FOLHA if(n->nchild <= 1) { Object * sintUni; - Object** sint = eval(n->children[0], scope, controllerSmv); + Object** sint = eval(n->children[0],scope,writeSmvTypeTable,controllerSmv); sintUni = sint[0]; char ops[1]; @@ -410,8 +383,8 @@ Object* evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv) else { // CUIDADO (ordem avaliação) - Object* o1 = evalEXPR(n->children[0], scope, controllerSmv); - Object* o2 = evalEXPR(n->children[1],scope, controllerSmv); + Object* o1 = evalEXPR(n->children[0], scope, writeSmvTypeTable, controllerSmv); + Object* o2 = evalEXPR(n->children[1],scope, writeSmvTypeTable, controllerSmv); int sOp = strlen(n->leafs[0]); char ops[2]; @@ -512,7 +485,7 @@ Object* evalEXPR(Node* n, STable* scope, HeaderController* controllerSmv) } -Object* evalProp(Node* fatherRef, Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalProp(Node* fatherRef, Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalProp] \n"); if(!n) @@ -533,7 +506,7 @@ Object* evalProp(Node* fatherRef, Node* n, STable* scope, HeaderController* cont } if(n->type == ADD_V) { - Object* expr = evalEXPR(n->children[0],scope, controllerSmv); + Object* expr = evalEXPR(n->children[0],scope, writeSmvTypeTable, controllerSmv); if(expr->type != NUMBER_ENTRY) { fprintf(stderr, "%s: INVALID INDEX!", fatherRef->leafs[0]); @@ -550,7 +523,7 @@ Object* evalProp(Node* fatherRef, Node* n, STable* scope, HeaderController* cont } -Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalAC_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[evalAC_V] \n"); @@ -564,7 +537,7 @@ Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv) } else { - Object* prop = evalProp(n,n->children[0], scope, controllerSmv); + Object* prop = evalProp(n,n->children[0], scope, writeSmvTypeTable, controllerSmv); if(entry->val->OBJECT_SIZE > 1) { @@ -580,22 +553,22 @@ Object* evalAC_V(Node* n, STable* scope, HeaderController* controllerSmv) } } -Object* evalV_PROP(Node* n, STable* scope, HeaderController* controllerSmv){ +Object* evalV_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ printf("[evalV_PROP] \n"); } -Object* evalADD_V(Node* n, STable* scope, HeaderController* controllerSmv){ +Object* evalADD_V(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ printf("[evalADD_V] \n"); } -Object* evalADD_V_PROP(Node* n, STable* scope, HeaderController* controllerSmv){ +Object* evalADD_V_PROP(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ printf("[evalADD_V_PROP] \n"); } -Object* evalV_PROP_TDS(Node* n, STable* scope, HeaderController* controllerSmv){ +Object* evalV_PROP_TDS(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ printf("[evalV_PROP_TDS] \n"); } -Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controllerSmv){ +Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ int I_TIME; int* ptitime = NULL; @@ -631,7 +604,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controlle void* vp[] = {ptitime}; updateValue("I_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",I_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,0,0); + updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,0,0); // necessita atualizar C_TIME updateValue("C_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); } @@ -639,12 +612,12 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, HeaderController* controlle void* vp[] = {ptftime}; updateValue("F_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",F_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],controllerSmv->mainInfo,smvBind,NUMBER_ENTRY,1,1); + updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,1,1); } return NULL; } -Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv) +Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { Object* expr = NULL; Object** sintExpr = NULL; @@ -667,7 +640,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv //Mudou CONTEXTO (C_TIME) : seguir o caso default // objeto sintetizado (chamar fora ou dentro do if depois das validações? avisa erros mais rapido) - sintExpr = eval(n->children[1], scope, controllerSmv); + sintExpr = eval(n->children[1],scope,writeSmvTypeTable,controllerSmv); expr = sintExpr[0]; if(expr && expr->type != NUMBER_ENTRY && expr->OBJECT_SIZE > 1) { @@ -696,7 +669,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv } else{ // busca expressão - sintExpr = eval(n->children[1], scope, controllerSmv); + sintExpr = eval(n->children[1],scope,writeSmvTypeTable,controllerSmv); expr = sintExpr[0]; // busca a variável e seu contexto @@ -711,16 +684,15 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv minmax = new > old; } // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) - //STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); - STable* refAuxTable = selectSMV_SCOPE(scope,controllerSmv); - HeaderSmv* refHeader = selectSMV_INFO(scope,expr->type == FUNCTION_ENTRY? expr : NULL,controllerSmv); - //HeaderSmv* refHeader = accessHeader(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN ,scope->order); + STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); + HeaderSmv* refHeader = accessHeader(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN ,scope->order); TableEntry* itimeEntry = lookup(scope,"I_TIME"); int itime = *(int*)itimeEntry->val->values[0]; int changeContext = ctime > itime; // verifica se mudou o contexto //binds da expressão + char directiveValueBind[300]; // tempo corrente // SINTH_BIND do valor da expressão (ou com o valor dela ou com o smv SINTH_BIND) char valueBind[300]; // SINTH_BIND do valor default caso a atribuição venha a necessitar criar um init e next juntos @@ -792,7 +764,7 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv } Node* ref = n->children[0]->children[0]; - Object* indexRef = ref->type == V_PROP ? NULL : eval(n, scope, controllerSmv)[0]; + Object* indexRef = ref->type == V_PROP ? NULL : eval(n,scope,writeSmvTypeTable,controllerSmv)[0]; if(ref->type == V_PROP || ref->type == ADD_V_PROP) { @@ -828,19 +800,19 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, HeaderController* controllerSmv return NULL; } -Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv){ +Object * evalCMD_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ Object* conditionalExpr = NULL; Object** sintExpr = NULL; STable* IF_SCOPE = addSubScope(scope,IF_BLOCK); - sintExpr = eval(n->children[0], scope, controllerSmv); + sintExpr = eval(n->children[0],scope,writeSmvTypeTable,controllerSmv); conditionalExpr = sintExpr[0]; printObject(conditionalExpr); bindCondition(IF_SCOPE,conditionalExpr); if(*(int*)conditionalExpr->values[0]){ - eval(n->children[1], IF_SCOPE, controllerSmv); // tenho que passar um parâmetro que define se avaliou + eval(n->children[1],IF_SCOPE,writeSmvTypeTable,controllerSmv); // tenho que passar um parâmetro que define se avaliou } else{ if(n->children[1]){ @@ -850,12 +822,12 @@ Object * evalCMD_IF(Node* n, STable* scope, HeaderController* controllerSmv){ return NULL; } -Object * evalMATCH_IF(Node* n, STable* scope, HeaderController* controllerSmv){ +Object * evalMATCH_IF(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv){ } -Object **eval(Node *n, STable *scope, HeaderController *controllerSmv) +Object** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv) { printf("[eval] %s \n",n->name); if(n) @@ -869,7 +841,7 @@ Object **eval(Node *n, STable *scope, HeaderController *controllerSmv) if(executores[n->type]) { printf("[PostProcess - eval] eval especifico \n\n"); - SYNTH_O[0] = executores[n->type](n,scope,controllerSmv); + SYNTH_O[0] = executores[n->type](n,scope,writeSmvTypeTable,controllerSmv); } else { @@ -883,7 +855,7 @@ Object **eval(Node *n, STable *scope, HeaderController *controllerSmv) if(toEval) { printf("(%d) %s \n",i,toEval->name); - Object** SYNTH_SET = eval(n->children[i], scope, controllerSmv); + Object** SYNTH_SET = eval(n->children[i],scope,writeSmvTypeTable,controllerSmv); SYNTH_O[i] = SYNTH_SET[0]; free(SYNTH_SET); } diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index 1354137..c8eb689 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -101,7 +101,6 @@ void letGoHeadersStruct(HeaderController *H) { HeaderController *createController() { int DEFAULT_HEADERS_SIZE = 5; - int DEFAULT_FUNCTIONS = 300; HeaderController* Hcontrol = malloc(sizeof(HeaderController)); Hcontrol->H_MAIN_CURRENT_SIZE = 0; @@ -110,11 +109,10 @@ HeaderController *createController() { Hcontrol->mainInfo = createTable(SMV_V_MAIN,NULL,0,0); Hcontrol->portsInfo = createTable(SMV_PORTS,NULL,0,0); - Hcontrol->functionsInfo = malloc(sizeof(STable*)*DEFAULT_FUNCTIONS); Hcontrol->MAIN_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); Hcontrol->AUTOMATA_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); - Hcontrol->PORTS_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); + Hcontrol->PORTS_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE);; Hcontrol->declaredPorts=0; return Hcontrol; From 8ecc629d9ddd232f037be7f4868fdf0e5136735e Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:12 -0300 Subject: [PATCH 23/30] =?UTF-8?q?Revert=20"Refletindo=20as=20mudan=C3=A7as?= =?UTF-8?q?=20da=20reformula=C3=A7=C3=A3o=20do=20pr=C3=A9=20processamento?= =?UTF-8?q?=20nos=20demais=20m=C3=B3dulos=20(#44,#45)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 81ec40603b2fb2c1af107226063f0177c96a2516. --- headers/STable.h | 2 -- src/datastructures/STable.c | 4 ++-- src/main.c | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/headers/STable.h b/headers/STable.h index b26f84c..2369d12 100644 --- a/headers/STable.h +++ b/headers/STable.h @@ -37,9 +37,7 @@ typedef struct S_TABLE int order; SCOPE_TYPE type; char* conditionBind; - int childOfFunction; TableEntry** tableData; - // info relacionada a inclusão int lastEntryIndex; int backup; int collision; diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index aa3460b..bb027fe 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -76,6 +76,7 @@ void printEntry(TableEntry* e) { +/// table STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { @@ -101,10 +102,9 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { newtable->lastEntryIndex = 0; newtable->backup = 0; newtable->collision = 0; - newtable->conditionBind = NULL; + newtable->conditionBind == NULL; newtable->children = NULL; newtable->parent = parent; - newtable->childOfFunction = parent->type == FUNC || parent->childOfFunction; /* if(chillist){ diff --git a/src/main.c b/src/main.c index e10d1ea..5c5158d 100644 --- a/src/main.c +++ b/src/main.c @@ -52,7 +52,7 @@ int main(int argc, char* argv[]) { printf("\n"); //pos processamento - eval(root, global, controller); + //eval(root,global,writeSmvTypeTable,controller); printf("\n"); printf("------------------------------------------------------------------------------\n"); From 24e507ee9c03be6b5212ee4906e1771916e9e02a Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:25 -0300 Subject: [PATCH 24/30] Revert "Adicionando arquivo que faltou do ultimo commit (#46, #47)" This reverts commit dde5de0f2d3b3e8db8908919ae7608d19706afc7. --- src/PreProcess.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index cbcb6f4..9c8332c 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -51,7 +51,7 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen char name[] = {line[1],'\0'}; //addValue(name,po,TYPE_SET,2,0,portsSmv); - addTypeSetSmv(name, po, 2, writeSmvTypeTable); + addTypeSetSmv(name, po, TYPE_SET, 2, writeSmvTypeTable); } header->VAR_POINTER += 1; } @@ -126,18 +126,14 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) int pointIni; int pointEnd; int tam = strlen(linhaLida); - int min; - int max; auxDelim = strstr(linhaLida,":"); auxFim = strstr(auxDelim,".."); pointIni = (auxDelim-linhaLida+2); pointEnd = ((auxFim-linhaLida))-1; - min = 0; - max = 3; - void* po[] = {&pos, &tam, &pointIni, &pointEnd,&min,&max}; // poderia generalizar isso aqui para evitar grandes erros - addValue(nome, po, WRITE_SMV_INFO, 6, 0, Hcontrol->mainInfo, 0); + void* po[] = {&pos, &tam, &pointIni, &pointEnd}; + addValue(nome, po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); // remover depois? (assim como a gente deve fazer o no pré processamento o "loop do time") @@ -152,6 +148,7 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) addValue("init(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); + char* linhaLidaNext = Hcontrol->MAIN_RELATED[0]->assignBuffer[3]; pos = 3; // note que a posição de inicio de leitura do next é irrelevante pela formatação do case tam = strlen(linhaLidaNext); @@ -163,6 +160,7 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) addValue("next(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); // ele salva: time = 6 : 0; (reboot) ou time < 3: time + 1; (incremento até F_TIME) + // seta as diretivas temporais globais da linguagem char* diretivas[] = {"I_TIME", "C_TIME","F_TIME"}; From a8d23eaa65bfbd6e1e7af68a33d8c4974a866999 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:33 -0300 Subject: [PATCH 25/30] Revert "Considerando: #46, #47" This reverts commit b3f2dbb58bc59920597b2466b875e1f6a859274a. --- headers/STable.h | 14 +------------- src/Interpreter.c | 12 ------------ src/datastructures/STable.c | 13 +++++++++---- src/main.c | 2 +- 4 files changed, 11 insertions(+), 30 deletions(-) diff --git a/headers/STable.h b/headers/STable.h index 2369d12..8158137 100644 --- a/headers/STable.h +++ b/headers/STable.h @@ -77,7 +77,7 @@ int checkTypeSet(STable* current, char* name, char* typeid); */ void addEntryToTypeSet(STable* current, char* name, char* typeid); -void addTypeSetSmv(char *name, void **any, int object_size, STable *current); +void addTypeSetSmv(char* name, void** any, int any_type, int object_size, STable* current); void addValue(char *name, void **any, int any_type, int object_size, int methodParam, STable *current, int timeContext); @@ -105,7 +105,6 @@ void printEntry(TableEntry* e); /** * Libera as entradas da tabela de simbolos, seguindo diferentes esquemas dependendo do type. * tupla-objeto-linguagem: n objetos de mesmo tipo (inteiro, timedirective, booleano, label, null, tds) - * tupla-init/next: pos, tamanho, pointIni, pointEnd * tupla-inteiros : pos, tamanho, pointIni, pointEnd, min, max * tupla-booleano: pos, tamanho * tupla-set: pos, tamanho, SIMPLE_HASH @@ -114,17 +113,6 @@ void printEntry(TableEntry* e); * */ void letgoEntry(TableEntry *e); -/** - * Libera as entradas da tabela de simbolos, seguindo diferentes esquemas dependendo do type. - * tupla-objeto-linguagem: n objetos de mesmo tipo (inteiro, timedirective, booleano, label, null, tds) - * tupla-inteiros : pos, tamanho, pointIni, pointEnd, min, max - * tupla-booleano: pos, tamanho - * tupla-set: pos, tamanho, SIMPLE_HASH - * - * @param e a entrada a ser liberada - * */ -void addNumericalIntervalSmv(char* name, int pos, int tam, int pointIni, int pointEnd, int min , int max, int newValue, STable* current); - #endif diff --git a/src/Interpreter.c b/src/Interpreter.c index 0946ab6..316f5df 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -9,18 +9,6 @@ typedef enum MAP_OP { PLUS = 43, MINUS = 45, TIMES = 42, DIVIDE = 47, MOD = 37, LT = 60, GT = 62, NOTEQUAL = 94, NOT_PREFIX = 110, LE = 121, EQUAL = 122, GE = 123} MAP_OP; -// caso a gente queira simplificar os parâmetros (note que muitos são desnecessários em alguns evals (MELHORIA)) -//typedef Object* (*generic_fp)(void); -/* - * generic_fp executores[80] = { - - (generic_fp ) evalNUM, (generic_fp ) evalBOOL, (generic_fp ) evalSTRING, (generic_fp ) evalNULL, (generic_fp ) evalIDVAR, (generic_fp ) evalTIME_DIRECTIVE, - (generic_fp ) evalDataV, (generic_fp ) evalPARAMS_CALL, (generic_fp ) evalDEFINE_INTERVAL , (generic_fp ) evalAC_V, - (generic_fp ) evalOTHER_ASSIGN, (generic_fp ) evalV_PROP, (generic_fp ) evalADD_V, (generic_fp ) evalADD_V_PROP, (generic_fp ) evalV_PROP_TDS, (generic_fp ) evalEXPR, (generic_fp ) - (generic_fp ) evalCMD_IF, (generic_fp ) evalMATCH_IF -}; - * */ - Object ** eval(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); Object* evalNUM(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); Object* evalBOOL(Node* n, STable* scope, STable** writeSmvTypeTable, HeaderController* controllerSmv); diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index bb027fe..6e51741 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -338,7 +338,7 @@ void addEntryToTypeSet(STable* current, char* name, char* typeid) { int present = 1; void* po = {&present}; - addValue(typeid, po, LOGICAL_ENTRY, 1, 0, entry->val->values[2], 0); + addValue(typeid, po, NUMBER_ENTRY, 1, 0, entry->val->values[2], 0); } } @@ -368,7 +368,7 @@ void addEntryToTypeSet(STable* current, char* name, char* typeid) */ -void addTypeSetSmv(char *name, void **any, int object_size, STable *current) +void addTypeSetSmv(char* name, void** any, int any_type, int object_size, STable* current) { printf("[addTypeSetSmv] add var-name: %s to %s \n",name,mappingEnumTable[current->type]); STable* hashset = createTable(SIMPLE_HASH,NULL,0,0); @@ -377,7 +377,7 @@ void addTypeSetSmv(char *name, void **any, int object_size, STable *current) printf("[addTypeSetSmv] (index: %d, size: %d) \n",*(int*)po[0],*(int*)po[1]); - addValue(name, po, TYPE_SET, object_size + 1, 0, current, 0); + addValue(name, po, any_type, object_size + 1, 0, current, 0); } void addNumericalIntervalSmv(char* name, int pos, int tam, int pointIni, int pointEnd, int min , int max, int newValue, STable* current){ @@ -408,9 +408,14 @@ void addWriteInfo(char* name, void** any, int any_type, int object_size, STable* // refatorar? os dois métodos, usar só um que recebe "qualquer coisa" e encapsula em um objeto void addValue(char *name, void **any, int any_type, int object_size, int methodParam, STable *current, int timeContext) { - // note que po é um ponteiro para objetos que o novo objeto irá encapsular, como criar ? + + // note que po é um ponteiro para objetos que o novo objeto irá encapsular, como criar ? + // POR ENQUANTO: + //void* pa[] = {&vali}; (pro :possibilita manipular arrays) (cons: tenho que tratar tudo como vetor até quando é um unico valor) + + Object* o = createObject(any_type, object_size, any, timeContext, NULL); o->SINTH_BIND = o->SINTH_BIND? o->SINTH_BIND : name; addValueCurrentScope(name,o,methodParam,current); diff --git a/src/main.c b/src/main.c index 5c5158d..0075a53 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ int main(int argc, char* argv[]) { //pré processamento preProcessSmv(smvP, controller); - setUpMainSmvTable(controller, global); + setUpMainSmvTable(controller, controller->mainInfo); printf("--------------------------------- EVAL ---------------------------------------------\n"); printf("\n"); From 8949dc0c2abe4da449935f38e0cb0e481aaa5e57 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:41 -0300 Subject: [PATCH 26/30] =?UTF-8?q?Revert=20"Terminando=20refomula=C3=A7?= =?UTF-8?q?=C3=A3o=20do=20PRE-PROCESSAMENTO"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 6b5f2a00186dce3991ef61967e357d98f6aecd48. --- src/PreProcess.c | 4 ++-- src/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index 9c8332c..560cade 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -311,6 +311,6 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { free(buffer); //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); -// addParamToPortsModule(Hcontrol, "random", 0); -// addParamToPortsModule(Hcontrol, "testandoDnovo", 0); + addParamToPortsModule(Hcontrol, "random", 0); + addParamToPortsModule(Hcontrol, "testandoDnovo", 0); } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 0075a53..277ed0c 100644 --- a/src/main.c +++ b/src/main.c @@ -45,7 +45,7 @@ int main(int argc, char* argv[]) { //pré processamento preProcessSmv(smvP, controller); - setUpMainSmvTable(controller, controller->mainInfo); +// setUpMainSmvTable(controller, NULL); printf("--------------------------------- EVAL ---------------------------------------------\n"); printf("\n"); From 2cfa04b57f7308588f5f45cd0caca5cd1face6ce Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:48 -0300 Subject: [PATCH 27/30] =?UTF-8?q?Revert=20"[#44,#45]=20Generaliza=C3=A7?= =?UTF-8?q?=C3=A3o=20ao=20propagar=20par=C3=A2metros=20concluida"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 8b056d1e2fce248e1cc9a86c5095a2d254d0c989. --- src/PreProcess.c | 1 - src/datastructures/HeaderSmv.c | 14 +++----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/PreProcess.c b/src/PreProcess.c index 560cade..fea3b51 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -312,5 +312,4 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); addParamToPortsModule(Hcontrol, "random", 0); - addParamToPortsModule(Hcontrol, "testandoDnovo", 0); } \ No newline at end of file diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index c8eb689..fbbfd99 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -284,18 +284,10 @@ void addNewHeader(HeaderController* controller, HeaderSmv* newHeader){ } } -void propagParamDependence(HeaderSmv **headers, char *param, int sizeHeaders, smvtype type) { +void propagParamDependence(HeaderSmv** headers, char* param, int sizeHeaders){ int i; - char* refOldName; char* refOldPt; for(i = 0; i < sizeHeaders; i++){ - if(type != MAIN){ - refOldName = headers[i]->moduleName; - char* newName = addParams(refOldName,param,"(",")"); - free(refOldName); - headers[i]->moduleName = newName; - } - refOldPt = headers[i]->varBuffer[headers[i]->VAR_RENAME_POINTER]; char* newDeclaration = addParams(refOldPt,param,"(",")"); free(refOldPt); @@ -310,9 +302,9 @@ void addParamToPortsModule(HeaderController *controller, char *param, int first) updated->moduleName = newName; // agora deve propagar as alterações para todos os demais módulos if(!first){ - propagParamDependence(controller->MAIN_RELATED, param, controller->H_MAIN_CURRENT_SIZE, MAIN); + propagParamDependence(controller->MAIN_RELATED,param,controller->H_MAIN_CURRENT_SIZE); } - propagParamDependence(controller->AUTOMATA_RELATED, param, controller->H_AUTOMATA_CURRENT_SIZE, AUTOMATA); + propagParamDependence(controller->AUTOMATA_RELATED,param,controller->H_AUTOMATA_CURRENT_SIZE); } From 14f59344f6bbfb11d85fc2efb6c15a925137740f Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:18:56 -0300 Subject: [PATCH 28/30] =?UTF-8?q?Revert=20"Corrigindo=20erro=20ao=20adicio?= =?UTF-8?q?nar=20mais=20par=C3=A2metros=20a=20um=20m=C3=B3dulo=20ou=20decl?= =?UTF-8?q?ara=C3=A7=C3=A3o,=20(al=C3=A9m=20disso=20melhorando=20documenta?= =?UTF-8?q?=C3=A7=C3=A3o=20e=20organiza=C3=A7=C3=A3o=20de=20c=C3=B3digo)?= =?UTF-8?q?=20(#44,45)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 2f5ab5a8db36700d144959e57390038c14566c48. --- headers/textManager.h | 33 ++-------------------- src/PreProcess.c | 1 - src/textManager.c | 64 +++++++++++++++++++++++-------------------- 3 files changed, 37 insertions(+), 61 deletions(-) diff --git a/headers/textManager.h b/headers/textManager.h index 4d83ee6..7f53640 100644 --- a/headers/textManager.h +++ b/headers/textManager.h @@ -2,41 +2,12 @@ #define TM_H -/** - * Concatena strings, porém sempre retornando o final da string como ponteiro, servindo para evitar percorrer a mesma - * diversas vezes ao se concatenar várias componentes (usada ao adicionar parâmetros por exemplo). Por outro lado, - * deve ser de total responsabilidade do método que chamou esse percorrer de volta para o endereço de inicio da string original - * - * @param dest a string alocada de destino - * @param src a string origem - * @param toIgnore o caracter o qual deve ser ignorado ou onde deve pararm a concatenação - * @param ignoreMode 0 caso deve copiar tudo antes do que deve ser ignorado, - * 1 ignorar tudo antes do que deve ser ignorado incluindo ele mesmo, - * - * @sideEffects : Atualiza dest, indo para a última posição disponível em memória, ou seja, com '\0' - * @return A nova um ponteiro para o fim da string destino já preenchida - * */ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode); -/** - * Adiciona um parâmetro a uma declaração. Ex: MODULE portsModule -> MODULE portsModule(time), - * ou MODULE portsModule(time) -> MODULE portsModule(time,param2), ou ainda {0,1,NULL} -> {0,1,NULL, OCUPADO}. - * Ou seja, adiciona a qualquer delcaração com ou sem delimitadores (, {, }, ), ... um parâmetro. - * - * Caso a delcaração não possua delimitadores, esses serão adicionados ao redor do parâmetro, - * caso essa já possua delimitador, o mais a direita (ex: }, ), ... ) será removido até se preencher o parâmetro. - * - * - * @param original um ponteiro para a string original - * @param param a componente a ser adicionada - * @param - * - * @sideEffects : Atualiza o updated, seja lá de onde que essa string veio em primeiro lugar - * - * @return A nova string alocada em outro ponteiro (a responsabilidade de free ou realloc fica fora dessa função) - * */ char *addParams(char *original, char *param, char *delim1, char *delim2); + + void clearOldPortsRefs(char* oldConstraint, char* toCopyResult); /** diff --git a/src/PreProcess.c b/src/PreProcess.c index fea3b51..c6ec5fc 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -311,5 +311,4 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { free(buffer); //printf("terminou! \n"); addParamToPortsModule(Hcontrol, "time", 1); - addParamToPortsModule(Hcontrol, "random", 0); } \ No newline at end of file diff --git a/src/textManager.c b/src/textManager.c index 08ec77c..4b7fd92 100644 --- a/src/textManager.c +++ b/src/textManager.c @@ -3,9 +3,11 @@ #include #include "../headers/textManager.h" - +// nota: ignore mode = 0 só o caracter especifico e tudo DEPOIS +// = 1 tudo ANTES DO CARACTER e o caracter especifico char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { + int ignoredExtra = 0; //printf("\t[customCat] source: %s \n\n\n",src); while(*dest){ @@ -14,12 +16,17 @@ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { dest++; // vai para a "proxima posição disponivel" (no caso de strings usadas anteriormente por essa função só roda "uma vez") } while(*src){ + //printf("\t[customCat] source atual: %s \n",src); if(!ignoreMode){ *dest = *src; //printf("\t[customCat] nova string atual: %s \n",dest); dest++; } + else { + ignoredExtra++; + } + src++; if(*src == toIgnore){ //printf("\t[customCat] delimiter detected\n"); @@ -29,9 +36,16 @@ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { if(!ignoreMode){ *dest = '\0'; - --dest; + --dest; //printf("\t[customCat - ignoreMode = 0] ponteiro fim : %s \n",dest); } + else { + *dest = ignoredExtra; + //printf("\t[customCat - ignoreMode = 1] caracteres ignorados : %d \n",ignoredExtra); + //printf("\t[customCat - ignoreMode = 1] equivalencia ascii: %c \n",ignoredExtra); + // salva quantos foram ignorados! + } + //printf("\t[customCat] ponteiro 'final' string: %s \n\n\n\n",dest); return dest; } @@ -71,56 +85,48 @@ void clearOldPortsRefs(char* oldConstraint, char* toCopyResult) { char *addParams(char *original, char *param, char* delim1, char* delim2) { char *newString; - char *auxNewAdd; - int breakline=0; // verifica se o final da string é \n - int statementEnd = 0; // verifica se o final da string é ; (não é nome de módulo) + int breakline=0; + int statementEnd = 0; int tamOriginal = strlen(original); if(original[tamOriginal-1] == '\n'){ breakline = 1; } - + //printf("aaaa: %c \n",original[strlen(original)-2]); if(original[tamOriginal-2]== ';'){ statementEnd = 1; } - // qualquer string passada (original) são das seguintes formas: xxxxxxxxx , xxxxxxxxx; , xxxxxxxxx(...)\n , xxxxxxxxx(...);\n - - // caso possua o delmitador de fechamento ) ou qualquer outro... - if(original[tamOriginal-3] == delim2[0] || original[tamOriginal-2] == delim2[0]){ - newString = (char*) calloc(strlen(original) + strlen(param) + 2 + 1, sizeof(char)); // original + param + ',' + ' ' + '\0' - auxNewAdd = newString; - auxNewAdd = customCat(auxNewAdd,original,delim2[0],0); + if(original[tamOriginal-3] == delim2[0] || original[tamOriginal-1] == delim2[0] || original[tamOriginal-2] == delim2[0]){ + newString = (char*) malloc(sizeof(char)*(strlen(original) +2+ strlen(param) +1)); // original + param + ',' + ' ' + '\0' + newString = customCat(newString,original,delim2[0],0); //printf("caso 1... %s \n",newString); - auxNewAdd = customCat(auxNewAdd,", ",0,0); + newString = customCat(newString,", ",0,0); //printf("caso 1... %s \n",newString); - auxNewAdd = customCat(auxNewAdd,param,0,0); + newString = customCat(newString,param,0,0); //printf("caso 1... %s \n",newString); - auxNewAdd = customCat(auxNewAdd,delim2,0,0); + newString = customCat(newString,delim2,0,0); //printf("caso 1... %s \n",newString); } else { - //printf("%ld %ld \n",strlen(original),strlen(param)); - newString = (char*) calloc(strlen(original) + 1 + strlen(param) + 1 + 1, sizeof(char)); -// newString = (char*) malloc(sizeof(char)*(strlen(original) + 1 + strlen(param) + 1 + 1)); // ( ) e \0 - auxNewAdd = newString; - + //printf("%ld %ld \n",strlen(original),strlen(param)); + newString = (char*) malloc(sizeof(char)*(strlen(original) + 1 + strlen(param) + 1 + 1)); // ( ) e \0 if(statementEnd){ - auxNewAdd = customCat(auxNewAdd,original,';',0); + newString = customCat(newString,original,';',0); } else{ - auxNewAdd = customCat(auxNewAdd,original,'\n',0); + newString = customCat(newString,original,'\n',0); } - auxNewAdd = customCat(auxNewAdd,delim1,0,0); - auxNewAdd = customCat(auxNewAdd,param,0,0); - auxNewAdd = customCat(auxNewAdd,delim2,0,0); + newString = customCat(newString,delim1,0,0); + newString = customCat(newString,param,0,0); + newString = customCat(newString,delim2,0,0); } if(statementEnd){ - auxNewAdd = customCat(auxNewAdd,";",0,0); + newString = customCat(newString,";",0,0); } if(breakline){ - auxNewAdd = customCat(auxNewAdd,"\n",0,0); + newString = customCat(newString,"\n",0,0); } -// newString = newString - ((strlen(original)+strlen(param)+2)-breakline); + newString = newString - ((strlen(original)+strlen(param)+2)-breakline); return newString; } From 253094fc45c57c2233d57ae9b5b585c5bf9b86df Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:19:05 -0300 Subject: [PATCH 29/30] =?UTF-8?q?Revert=20"Reformula=C3=A7=C3=A3o=20do=20p?= =?UTF-8?q?r=C3=A9=20processamento=20para=20renomear=20dependencias=20(#32?= =?UTF-8?q?,#44,#45)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 8c90365df345b2c0cb4d24d22805221f2817e649. --- headers/HeaderSmv.h | 90 +++---------------- headers/PreProcess.h | 45 ++++------ headers/STable.h | 1 - src/Interpreter.c | 11 ++- src/PostProcess.c | 10 +-- src/PreProcess.c | 160 ++++++++++++++++++--------------- src/datastructures/HeaderSmv.c | 138 +++++----------------------- src/datastructures/STable.c | 19 +++- src/langmodules/Object.c | 15 +++- src/main.c | 41 +++++---- 10 files changed, 198 insertions(+), 332 deletions(-) diff --git a/headers/HeaderSmv.h b/headers/HeaderSmv.h index 41c523b..a855fc2 100644 --- a/headers/HeaderSmv.h +++ b/headers/HeaderSmv.h @@ -2,15 +2,11 @@ #define HEADER_H -#include -#include "textManager.h" -#include "Enum.h" - -typedef enum headerpart {CREATE_MODULE = -1, VAR = 0, ASSIGN = 1, TRANS = 2} headerpart; +enum headerPart {CREATE_MODULE = -1, VAR = 0, ASSIGN = 1, TRANS = 2}; typedef struct headersmv { - smvtype type; + int type; char* moduleName; char** varBuffer; // poderia transormar em uma tabela hash(facilidade em achar a variavel, mas acredito que uma vez escrito aqui não vai ter alteração!) char** transBuffer; // vai ser inalterado durante a execução (só no pré processamento, ou seja já é criado preeenchido) @@ -18,7 +14,6 @@ typedef struct headersmv int VAR_POINTER; int TRANS_POINTER; int ASSIGN_POINTER; - int VAR_RENAME_POINTER; //char** declaredPorts; // usar para impedir o usuário de se "sabotar" usando ports que não existem }HeaderSmv; @@ -27,92 +22,33 @@ HeaderSmv* createHeader(int type, char* moduleName, int varP, int assignP, int t void letgoHeader(HeaderSmv* h); + +/*Controlador de Header(auxiliar)*/ +HeaderSmv** initHeadersStruct(int size); + +void letGoHeadersStruct(HeaderSmv** hs, int size); + + typedef struct headerController { - HeaderSmv** MAIN_RELATED; - HeaderSmv** AUTOMATA_RELATED; - HeaderSmv** PORTS_RELATED; - int H_MAIN_CURRENT_SIZE; - int H_AUTOMATA_CURRENT_SIZE; - int H_PORTS_CURRENT_SIZE; + HeaderSmv ** headers; int declaredPorts; - STable* mainInfo; - STable* portsInfo; - //int CURRENT_SIZE; // usar current size com -1 (se vc está processando o indice atual(ultimo) é porque ele já alocou para o seguinte!) + int CURRENT_SIZE; // usar current size com -1 (se vc está processando o indice atual(ultimo) é porque ele já alocou para o seguinte!) // ex: sétimo membro(6) (CURRENT_SIZE = 7) (ou seja para referenciar o último é só pegar CURRENT-1) }HeaderController; -HeaderController *createController(); - - -/** - * Libera o controlador e todas as estruturas armazenadas por ele - * @SidEffects: Chama o liberar dos headers e tabelas de simbolos - * */ -void letGoHeadersStruct(HeaderController *H); +HeaderController* createController(int size); void letGoHeaderControl(HeaderController* Hcontrol); -/** - * Printa cada componente: VAR, ASSIGN, TRANS de um módulo SMV - * */ +/*Controlador de Header(auxiliar)*/ void printHeaderBuffer(HeaderSmv* h, int type, char* typeString); -/** - * Printa o módulo SMV e suas componentes: VAR, ASSIGN, TRANS - * */ void printHeader(HeaderSmv* h); -/** - * Printa todas os headers armazenados pelo controlador - * */ -void printAllHeaders(HeaderController* Hcontrol); - void writeHeaderBuffer(HeaderSmv* h, int part, FILE* smvoutput); void writeHeader(HeaderSmv* header, FILE* smvoutput); -/** - * Considerando a refatoração do controller e header, encapsulamos o header apropriado pela estrutura, e esse deve - * ser recuperado usando o enum de smvtype e o indice. - * - * Caso o indice não seja informado o último header salvo (tanto do agrupamento main, automato, ou ports) é retornado - * Esse comportamento é usado pelo pré processamento, considerando que cada agrupamento é consultado para verificar o - * progresso de algumas alterações (ex: trocar FROZENVAR de portsModule), e otimizações da leitura - * - * @param controller o controlador de headers - * @param cat o tipo smv de parte de intesse (main, automato/modulo generico, ports) - * @param indexOfHeader a ordem de headers de cada parte de interesse (ex: 0 = portsModule, 1: função1 associada a tds) - * - * @returns o header apropriado com a parte de interesse do arquivo SMV - * */ -HeaderSmv* accessHeader(HeaderController* controller, smvtype cat, int indexOfHeader); - -/** - * Considerando a refatoração do controller e header, encapsulamos as tabelas de simbolo auxiliares (SMV_INFO) - * ser recuperado usando o enum de smvtype. - * - * @param controller o controlador de headers - * @param cat o tipo smv de parte de intesse (main, automato/modulo generico, ports) - * - * @returns a tabela de simbolos SMV_INFO apropriada - * */ -STable* accessSmvInfo(HeaderController* controller, smvtype cat); - -/** - * Adiciona um novo header ao controller encapsulando suas operações e categorizando apropriadamente - * @param o controller - * @param o novo header retornado por createHeader - */ -void addNewHeader(HeaderController* controller, HeaderSmv* newHeader); - -/** - * Adiciona um novo parâmetro a portModule, e resolve as depêndencias nos demais módulos main e automato. - * @param o controller - * @param o novo parâmetro - * @SideEffects: Para cada módulo (main, automato ...) é atualizada a linha com depdência a ports e essa operação chama - * o módulo textManager e seus método addParams, criando uma string nova e liberando a antiga - */ -void addParamToPortsModule(HeaderController *controller, char *param, int first); #endif diff --git a/headers/PreProcess.h b/headers/PreProcess.h index 71ed2dd..c3c9a3a 100644 --- a/headers/PreProcess.h +++ b/headers/PreProcess.h @@ -3,6 +3,9 @@ #define PREP_H #include "HeaderSmv.h" +#include "STable.h" + + /* @@ -12,7 +15,7 @@ * cria um header (necessita de free depois) */ -void initPreProcessHeader(smvtype type, char* moduleName, HeaderController* Hcontrol); +void initPreProcessHeader(int type, char* moduleName, HeaderController* Hcontrol); @@ -23,7 +26,7 @@ void initPreProcessHeader(smvtype type, char* moduleName, HeaderController* Hcon * ao ter controlRename como true, ele remove todas as ocorrências de determinados caracteres (no caso []) */ -void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRename, int currentHeader, STable *writeSmvTypeTable); +void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable); @@ -32,8 +35,7 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen ratando a posição (pos) que representa o tamanho do vetor de HEADERS do controller (LEN-1) */ -void saveLineOnBuffer(smvtype currentHeader, headerpart part, char *line, HeaderController *Hcontrol, int controlRename, - STable *writeSmvTypeTable); +void saveLineOnBuffer(int pos,int part, char* line, HeaderController* Hcontrol, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable); @@ -41,31 +43,16 @@ void saveLineOnBuffer(smvtype currentHeader, headerpart part, char *line, Header as partes de interesse servem como delimitadores, quebras de linha servem como delimitadores dos módulos stages são os módulos 0(main), automato(2), ports(3) */ -void processPhase(smvtype stage, headerpart part, HeaderController *Hcontrol, char *line, int controlRename, - STable *writeSmvTypeTable); -/** - * Salva o arquivo SMV original em headers, separados por categorias e partes de um arquivo SMV. - * Durante esse pré processamento, são usadas variáveis strings auxiliares para reconhecer pontos de interesse no arquivo. - * A cada ponto de interesse identificado, um buffer do header é escolhido, e esse atualizado. - * Ao se identificar o alguma referência a portsModule essa tem o parâmetro time adicionado, e uma referência é salva no header do automato, - * para renomações futuras. Além disso são criadas entradas na tabelas de simbolos auxiliares (SMV_INFO) usadas pelo main e ports, respectivamente, - * a variável time e as portas que vierem do módulo original. - * */ -void preProcessSmv(FILE *smvP, HeaderController *Hcontrol); - - -/** - * Configura a tabela de controle SMV info da main para a variável time a incializando - * com uma tupla de inteiros (que não possui typeset, por so poder ser X..Y). Além disso, - * inicializa as diretivas temporais no escopo global (main). - * - * @param Hcontrol o controller de headers e informações SMV - * @param global a tabela de simbolos global do "programa" .tds - * - * @SideEffects: Chama o addValue da tabela de simbolos para os casos citados, alocando memória para as Entry de - * cada tupla. - * */ -void setUpMainSmvTable(HeaderController *Hcontrol, STable *global); +void processPhase(int stage, int part, HeaderController* Hcontrol, char * line, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable); + + +void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvTypeTable); + +/* + configura a tabela de controle de escrita para a diretiva temporal do Header Main + inicializando com a variável time (que não possui typeset, por so poder ser X..Y) +*/ +void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, STable* global); #endif diff --git a/headers/STable.h b/headers/STable.h index 8158137..232bf8b 100644 --- a/headers/STable.h +++ b/headers/STable.h @@ -6,7 +6,6 @@ #include "Object.h" #define MAX_TABLE 950 -#define MAX_SIMPLE 100 #define MAX_CHILD 150 diff --git a/src/Interpreter.c b/src/Interpreter.c index 316f5df..91c39fb 100644 --- a/src/Interpreter.c +++ b/src/Interpreter.c @@ -592,7 +592,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, void* vp[] = {ptitime}; updateValue("I_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",I_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,0,0); + updateTime(controllerSmv->headers[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,0,0); // necessita atualizar C_TIME updateValue("C_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); } @@ -600,7 +600,7 @@ Object * evalDEFINE_INTERVAL(Node* n, STable* scope, STable** writeSmvTypeTable, void* vp[] = {ptftime}; updateValue("F_TIME", vp, T_DIRECTIVE_ENTRY, 1, -1, -1, scope, 0); sprintf(smvBind,"%d",F_TIME); - updateTime(controllerSmv->MAIN_RELATED[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,1,1); + updateTime(controllerSmv->headers[0],writeSmvTypeTable[0],smvBind,NUMBER_ENTRY,1,1); } return NULL; } @@ -671,10 +671,9 @@ Object* evalOTHER_ASSIGN(Node* n, STable* scope, STable** writeSmvTypeTable, Hea int new = *(int*)expr->values[0]; minmax = new > old; } - // decidir o que vai usar do Hcontroller (tem que ser melhor adaptado) - STable* refAuxTable = accessSmvInfo(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN); - HeaderSmv* refHeader = accessHeader(controllerSmv,scope->type == FUNC && expr->type == TDS_ENTRY? PORTS : MAIN ,scope->order); - + STable* refAuxTable = writeSmvTypeTable[scope->type == FUNC && expr->type == TDS_ENTRY? controllerSmv->CURRENT_SIZE-1 : 0 ]; + // ports ou main + HeaderSmv* refHeader = controllerSmv->headers[scope->type == FUNC && expr->type == TDS_ENTRY? controllerSmv->CURRENT_SIZE-1 : 0 ]; TableEntry* itimeEntry = lookup(scope,"I_TIME"); int itime = *(int*)itimeEntry->val->values[0]; int changeContext = ctime > itime; // verifica se mudou o contexto diff --git a/src/PostProcess.c b/src/PostProcess.c index ed44d60..1437f4e 100644 --- a/src/PostProcess.c +++ b/src/PostProcess.c @@ -410,14 +410,8 @@ void writeResultantHeaders(HeaderController* controller, const char* path){ int i; FILE* smvoutput = fopen(path, "w"); - for(i = 0; i< controller->H_MAIN_CURRENT_SIZE; i++){ - writeHeader(controller->MAIN_RELATED[i],smvoutput); - } - for(i = 0; i< controller->H_AUTOMATA_CURRENT_SIZE; i++){ - writeHeader(controller->AUTOMATA_RELATED[i],smvoutput); - } - for(i = 0; i< controller->H_PORTS_CURRENT_SIZE; i++){ - writeHeader(controller->PORTS_RELATED[i],smvoutput); + for(i = 0; i< controller->CURRENT_SIZE; i++){ + writeHeader(controller->headers[i],smvoutput); } fclose(smvoutput); diff --git a/src/PreProcess.c b/src/PreProcess.c index c6ec5fc..4b2f57b 100644 --- a/src/PreProcess.c +++ b/src/PreProcess.c @@ -1,6 +1,7 @@ #include #include #include +#include "../headers/textManager.h" #include "../headers/PreProcess.h" @@ -11,10 +12,10 @@ * cria um header (necessita de free depois) */ -void initPreProcessHeader(smvtype type, char* moduleName, HeaderController* Hcontrol) { +void initPreProcessHeader(int type, char* moduleName, HeaderController* Hcontrol) { int transP = type == AUTOMATA? 0 : -1; - HeaderSmv* newHeader = createHeader(type, moduleName, 0, 0, transP); - addNewHeader(Hcontrol,newHeader); + Hcontrol->headers[Hcontrol->CURRENT_SIZE] = createHeader(type, moduleName, 0, 0, transP); + Hcontrol->CURRENT_SIZE += 1; } /* @@ -23,7 +24,7 @@ void initPreProcessHeader(smvtype type, char* moduleName, HeaderController* Hcon * ao ter controlRename como true, ele remove todas as ocorrências de determinados caracteres (no caso []) */ -void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRename, int currentHeader, STable *writeSmvTypeTable) { +void selectBuffer(int part, char* line, HeaderSmv* header, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable) { int pt; int tam = strlen(line); char* aloc = malloc((tam+1) * sizeof(char)); @@ -35,14 +36,7 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen pt = header->VAR_POINTER; header->varBuffer[pt] = aloc; - if(currentHeader == MAIN && strstr(line,"(time)")) { - header->VAR_RENAME_POINTER = pt; - } - if(currentHeader == AUTOMATA && line[0] == '\t' && line[1] == 'p'){ - header->VAR_RENAME_POINTER = pt; - } - - if(currentHeader == PORTS && (line[0] == '\t' || strstr(line,":"))) + if(readVarsPortsModule) { printf("[saveLineOnBuffer] Salvando tabela de portas (%s) \n\n",line); printf("[saveLineOnBuffer] Salvando tabela de portas (%c) \n\n",line[1]); @@ -51,8 +45,9 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen char name[] = {line[1],'\0'}; //addValue(name,po,TYPE_SET,2,0,portsSmv); - addTypeSetSmv(name, po, TYPE_SET, 2, writeSmvTypeTable); + addTypeSetSmv(name, po, TYPE_SET, 2, writeSmvTypeTable[1]); } + header->VAR_POINTER += 1; } if(part == ASSIGN) @@ -83,6 +78,7 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen //} } header->TRANS_POINTER += 1; + } } @@ -91,16 +87,15 @@ void selectBuffer(headerpart part, char* line, HeaderSmv* header, int controlRen ratando a posição (pos) que representa o tamanho do vetor de HEADERS do controller (LEN-1) */ -void saveLineOnBuffer(smvtype currentHeader, headerpart part, char *line, HeaderController *Hcontrol, int controlRename, STable *writeSmvTypeTable) { - HeaderSmv* current = accessHeader(Hcontrol,currentHeader,-1); - selectBuffer(part, line, current, controlRename, currentHeader, writeSmvTypeTable); +void saveLineOnBuffer(int pos,int part, char* line, HeaderController* Hcontrol, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable) { + selectBuffer(part,line,Hcontrol->headers[pos-1],controlRename,readVarsPortsModule,writeSmvTypeTable); } /* fases: criação, var, assign(pode não existir), trans(pode não existir) (as partes de interesse) as partes de interesse servem como delimitadores, quebras de linha servem como delimitadores dos módulos stages são os módulos 0(main), automato(2), ports(3) */ -void processPhase(smvtype stage, headerpart part, HeaderController *Hcontrol, char *line, int controlRename, STable *writeSmvTypeTable) { +void processPhase(int stage, int part, HeaderController* Hcontrol, char * line, int controlRename, int readVarsPortsModule, STable** writeSmvTypeTable) { // modulo if(part == CREATE_MODULE) { @@ -109,35 +104,37 @@ void processPhase(smvtype stage, headerpart part, HeaderController *Hcontrol, ch } // VAR, ASSIGN, TRANS else{ - saveLineOnBuffer(stage, part, line, Hcontrol, controlRename, writeSmvTypeTable); + saveLineOnBuffer(Hcontrol->CURRENT_SIZE,part,line,Hcontrol,controlRename,readVarsPortsModule, writeSmvTypeTable); } } -void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) +void setUpMainSmvTable(HeaderController* Hcontrol, STable** writeSmvTypeTable, STable* global) { // seta alguns pontos de interesse da diretiva temporal char nome[] = "time"; char* auxDelim; char* auxFim; - char* linhaLida = Hcontrol->MAIN_RELATED[0]->varBuffer[1]; + char* linhaLida = Hcontrol->headers[0]->varBuffer[1]; int pos = 1; int pointIni; int pointEnd; int tam = strlen(linhaLida); auxDelim = strstr(linhaLida,":"); + auxFim = strstr(auxDelim,".."); + pointIni = (auxDelim-linhaLida+2); pointEnd = ((auxFim-linhaLida))-1; void* po[] = {&pos, &tam, &pointIni, &pointEnd}; - addValue(nome, po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); + addValue(nome, po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable[0], 0); // remover depois? (assim como a gente deve fazer o no pré processamento o "loop do time") - char* linhaLidaInit = Hcontrol->MAIN_RELATED[0]->assignBuffer[1]; + char* linhaLidaInit = Hcontrol->headers[0]->assignBuffer[1]; pos = 1; tam = strlen(linhaLidaInit); @@ -146,10 +143,10 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) pointIni = auxDelim - linhaLidaInit+2; // pointEnd = auxFim - linhaLidaInit-1; // entra no intervalo de sobrescrita - addValue("init(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); + addValue("init(time)", po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable[0], 0); - char* linhaLidaNext = Hcontrol->MAIN_RELATED[0]->assignBuffer[3]; + char* linhaLidaNext = Hcontrol->headers[0]->assignBuffer[3]; pos = 3; // note que a posição de inicio de leitura do next é irrelevante pela formatação do case tam = strlen(linhaLidaNext); @@ -158,7 +155,7 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) pointIni = auxDelim - linhaLidaNext+2; pointEnd = auxFim - linhaLidaNext-1; - addValue("next(time)", po, WRITE_SMV_INFO, 4, 0, Hcontrol->mainInfo, 0); + addValue("next(time)", po, WRITE_SMV_INFO, 4, 0, writeSmvTypeTable[0], 0); // ele salva: time = 6 : 0; (reboot) ou time < 3: time + 1; (incremento até F_TIME) @@ -174,7 +171,7 @@ void setUpMainSmvTable(HeaderController *Hcontrol, STable *global) } -void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { +void preProcessSmv(FILE* smvP, HeaderController* Hcontrol, STable** writeSmvTypeTable) { /*Strings que são usadas para a busca no arquivo*/ char varString[] = "VAR \n"; @@ -183,31 +180,31 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { char fVarString[] = "FROZENVAR"; char portsModuleString[] = "MODULE portsModule"; char automataString[] = "MODULE finalAutomata(time)"; - char beginModuleString[] = "MODULE "; - - // se não encontrar isso após "começar a ler um automato" quer dizer que era um módulo qualquer - char confirmAutomataString[] = "cs: {"; + char beginModuleString[] = "MODULE "; + + char confirmAutomataString[] = "cs: {"; // se não encontrar isso após "começar a ler um automato" quer dizer que era um módulo qualquer // ATUALIZAR: usar string "caracteristica" para detectar módulos de "função" (transform) + + /*Parâmetro a ser adicionado a PortsModule */ char timeString[] = "time"; /*Variáveis de controle de cursor e buffer - -> buffer - -> propriedades do buffer - -> ponteiro auxiliar + -> propriedades do buffer e buffer auxiliar */ + char* buffer; char* bufferAux; size_t bufsize = 300; buffer = (char *) malloc(bufsize * sizeof(char)); //bufferAux = (char *) malloc(bufsize * sizeof(char)); - /*Variáveis de controle de leitura - -> estamos em qual "estagio" de interesse (1 = MAIN, 2 = Módulos(automato e outros), 3 = Ports) + /*Variáveis de controle de "onde no arquivo estamos" + -> estamos em qual "estagio" de interesse (1 = MAIN, 2 = Módulos(automato e funcoes), 3 = Ports) -> indice baseado no estagio corrente -> em qual fase dos estágios estamos (-1 = lendo inicio do módulo, 0 =var , 1 = ASSIGN, 2= TRANS ) (note que assign e trans podem não existir ) -> estamos lendo um ASSIGN - -> estamos lendo TRANS (relação de transição do automato) + -> estamos lendo a relação de transição do automato -> deve-se renomear referencias a portsModule -> estamos lendo automato -> estamos lendo portsModule @@ -221,15 +218,20 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { int controlRename = 0; int readAutomata = 0; int readPortsModule = 0; + int afterVarParPorts = 0; + int readVarsPortsModule = 0; int renamePortsParam = 0; while ((fgets(buffer,bufsize,smvP))) { bufferAux = buffer; + // ajuda a não rodar na primeira passada (do main) if(stage != MAIN && !readPortsModule && !readAutomata){ if(strstr(buffer,portsModuleString)) { stage = PORTS; + bufferAux = addParams(buffer, timeString, "(", ")"); + renamePortsParam = 1; readPortsModule = 1; } else{ @@ -237,7 +239,8 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { readAutomata = 1; } } - // estamos ainda no meio do módulo + + if(buffer[0] != '\n') { if(phase == TRANS) @@ -254,49 +257,25 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { { //printf("[preProcessSmv] Buffer pré computePhase 2 %s \n\n",buffer); readTrans = (buffer[0] == 'T' && strstr(buffer,transString)); + // na verdade entramos na fase de leitura de transições que veio LOGO DEPOIS DE ATRIBUIÇÕES if(readTrans) { //printf("[preProcessSmv] terminou ASSIGN \n\n"); phase = TRANS; // mudou de fase } + } else { break; // não precisa mais ler(vai ser lido da arvore) } - } - - // usa a primeira letra de cada parte de interesse primeiro para realizar curto circuito - if(phase == VAR) - { - //printf("[preProcessSmv] Buffer pré computePhase1 %s \n\n",buffer); - readAssign = (buffer[0] == 'A' && strstr(buffer,assignString)); - readTrans = (buffer[0] == 'T' && strstr(buffer,transString)); - - if(!(readAssign || readTrans)) - { - int iniVar = accessHeader(Hcontrol, stage, -1)->VAR_POINTER == 0; - if(readPortsModule && iniVar && strstr(buffer,fVarString)) { - //printf("[preProcessSmv] Trocou FVAR %s\n",buffer); - bufferAux = varString; // tratamento de FROZEN VAR - } - } - else - { - //printf("[preProcessSmv] terminou VAR \n\n"); - phase = readAssign ? ASSIGN : TRANS; - readAssign = 0; - } - - } - processPhase(stage, phase, Hcontrol, bufferAux, controlRename, accessSmvInfo(Hcontrol,stage)); - if(phase == CREATE_MODULE){ - phase++; - } + + } + } - // proximo modulo (módulos são separados por quebra de linha) + // módulos são separados por quebra de linha else { // reinicio @@ -304,11 +283,52 @@ void preProcessSmv(FILE *smvP, HeaderController *Hcontrol) { stage++; readAutomata = 0; //printf("[preProcessSmv] módulo acabou \n\n"); + continue; } - //printf("%l\n",Hcontrol->) + + // usa a primeira letra de cada parte de interesse primeiro para realizar curto circuito + if(phase == VAR) + { + //printf("[preProcessSmv] Buffer pré computePhase1 %s \n\n",buffer); + readAssign = (buffer[0] == 'A' && strstr(buffer,assignString)); + readTrans = (buffer[0] == 'T' && strstr(buffer,transString)); + + if(!(readAssign || readTrans)) + { + int iniVar = Hcontrol->headers[Hcontrol->CURRENT_SIZE-1]->VAR_POINTER == 0; + if(readPortsModule && iniVar && strstr(buffer,fVarString)) { + //printf("[preProcessSmv] Trocou FVAR %s\n",buffer); + bufferAux = varString; // tratamento de FROZEN VAR + afterVarParPorts = 1; + } + } + else + { + //printf("[preProcessSmv] terminou VAR \n\n"); + phase = readAssign ? ASSIGN : TRANS; + readAssign = 0; + } + + } + + processPhase(stage,phase,Hcontrol,bufferAux,controlRename,readVarsPortsModule,writeSmvTypeTable); + + if(phase == CREATE_MODULE){ + phase++; + } + + + if(afterVarParPorts) + { + readVarsPortsModule = 1; + } + + if(renamePortsParam && phase == PORTS){ + free(bufferAux); + renamePortsParam = 0; + } } free(buffer); - //printf("terminou! \n"); - addParamToPortsModule(Hcontrol, "time", 1); + //printf("terminou! \n"); } \ No newline at end of file diff --git a/src/datastructures/HeaderSmv.c b/src/datastructures/HeaderSmv.c index fbbfd99..b202c95 100644 --- a/src/datastructures/HeaderSmv.c +++ b/src/datastructures/HeaderSmv.c @@ -2,6 +2,7 @@ #include #include #include "../../headers/HeaderSmv.h" +#include "../../headers/Enum.h" HeaderSmv* createHeader(int type, char* moduleName, int varP, int assignP, int transP) { @@ -26,7 +27,6 @@ HeaderSmv* createHeader(int type, char* moduleName, int varP, int assignP, int t } else{ header->transBuffer = NULL; - header->VAR_RENAME_POINTER = -1; } return header; @@ -77,42 +77,27 @@ void letgoHeader(HeaderSmv* h){ free(h); } -void letGoRelatedHeaders(HeaderSmv** RHeader, int size){ - int i; - if(RHeader){ - for(i = 0; i< size; i++){ - letgoHeader(RHeader[i]); - RHeader[i] = NULL; - } - } -} - -void letGoHeadersStruct(HeaderController *H) { - - letGoRelatedHeaders(H->MAIN_RELATED, H->H_MAIN_CURRENT_SIZE); - letGoRelatedHeaders(H->AUTOMATA_RELATED, H->H_AUTOMATA_CURRENT_SIZE); - letGoRelatedHeaders(H->PORTS_RELATED, H->H_PORTS_CURRENT_SIZE); - letgoTable(H->mainInfo); - letgoTable(H->portsInfo); - free(H); +HeaderSmv** initHeadersStruct(int size) { + + HeaderSmv** headers = ( HeaderSmv**) malloc(sizeof(HeaderSmv*)*size); + return headers; } -HeaderController *createController() { - - int DEFAULT_HEADERS_SIZE = 5; - - HeaderController* Hcontrol = malloc(sizeof(HeaderController)); - Hcontrol->H_MAIN_CURRENT_SIZE = 0; - Hcontrol->H_AUTOMATA_CURRENT_SIZE = 0; - Hcontrol->H_PORTS_CURRENT_SIZE = 0; - - Hcontrol->mainInfo = createTable(SMV_V_MAIN,NULL,0,0); - Hcontrol->portsInfo = createTable(SMV_PORTS,NULL,0,0); +void letGoHeadersStruct(HeaderSmv** hs, int size){ + + int i; + for(i = 0; i< size; i++){ + letgoHeader(hs[i]); + hs[i] = NULL; + } + free(hs); +} - Hcontrol->MAIN_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); - Hcontrol->AUTOMATA_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE); - Hcontrol->PORTS_RELATED = malloc(sizeof(HeaderSmv*)*DEFAULT_HEADERS_SIZE);; +HeaderController* createController(int size) { + HeaderController* Hcontrol = malloc(sizeof(HeaderController)); + Hcontrol->CURRENT_SIZE = 0; + Hcontrol->headers = initHeadersStruct(size); Hcontrol->declaredPorts=0; return Hcontrol; @@ -120,20 +105,8 @@ HeaderController *createController() { void letGoHeaderControl(HeaderController* Hcontrol) { - letGoHeadersStruct(Hcontrol); -} - -void printAllHeaders(HeaderController* Hcontrol){ - int i; - for (i = 0; i < Hcontrol->H_MAIN_CURRENT_SIZE; i++){ - printHeader(Hcontrol->MAIN_RELATED[i]); - } - for (i = 0; i < Hcontrol->H_AUTOMATA_CURRENT_SIZE; i++){ - printHeader(Hcontrol->AUTOMATA_RELATED[i]); - } - for (i = 0; i < Hcontrol->H_PORTS_CURRENT_SIZE; i++){ - printHeader(Hcontrol->PORTS_RELATED[i]); - } + letGoHeadersStruct(Hcontrol->headers,Hcontrol->CURRENT_SIZE); + free(Hcontrol); } @@ -236,76 +209,5 @@ void writeHeader(HeaderSmv* header, FILE* smvoutput){ fprintf(smvoutput,"%s","\n"); } -HeaderSmv* accessHeader(HeaderController* controller, smvtype cat, int indexOfHeader){ - HeaderSmv* toReturn = NULL; - if(cat == MAIN){ - toReturn = indexOfHeader != -1? controller->MAIN_RELATED[indexOfHeader] : controller->MAIN_RELATED[controller->H_MAIN_CURRENT_SIZE-1]; - } - if(cat == AUTOMATA){ - toReturn = indexOfHeader != -1? controller->AUTOMATA_RELATED[indexOfHeader] : controller->AUTOMATA_RELATED[controller->H_AUTOMATA_CURRENT_SIZE-1]; - } - if(cat == PORTS){ - toReturn = indexOfHeader != -1? controller->PORTS_RELATED[indexOfHeader] : controller->PORTS_RELATED[controller->H_PORTS_CURRENT_SIZE-1]; - } - if(!toReturn){ - fprintf(stderr, "[accessHeader] INVALID SMV TYPE FOR OPERATION"); - exit(-1); - } - return toReturn; - -} - -STable* accessSmvInfo(HeaderController* controller, smvtype cat){ - if(cat == MAIN){ - return controller->mainInfo; - } - if(cat == PORTS){ - return controller->portsInfo; - } - if(cat == AUTOMATA){ - return NULL; // melhorar, apesar que sabe-se que não tem operação em tabela de simbolos para automato (por enquanto) - } - fprintf(stderr, "[accessSmvInfo] INVALID SMV TYPE FOR OPERATION"); - exit(-1); -} - -void addNewHeader(HeaderController* controller, HeaderSmv* newHeader){ - if(newHeader->type == MAIN){ - controller->MAIN_RELATED[controller->H_MAIN_CURRENT_SIZE] = newHeader; - controller->H_MAIN_CURRENT_SIZE++; - } - if(newHeader->type == AUTOMATA){ - controller->AUTOMATA_RELATED[controller->H_AUTOMATA_CURRENT_SIZE] = newHeader; - controller->H_AUTOMATA_CURRENT_SIZE++; - } - if(newHeader->type == PORTS){ - controller->PORTS_RELATED[controller->H_PORTS_CURRENT_SIZE] = newHeader; - controller->H_PORTS_CURRENT_SIZE++; - } -} - -void propagParamDependence(HeaderSmv** headers, char* param, int sizeHeaders){ - int i; - char* refOldPt; - for(i = 0; i < sizeHeaders; i++){ - refOldPt = headers[i]->varBuffer[headers[i]->VAR_RENAME_POINTER]; - char* newDeclaration = addParams(refOldPt,param,"(",")"); - free(refOldPt); - headers[i]->varBuffer[headers[i]->VAR_RENAME_POINTER] = newDeclaration; - } -} - -void addParamToPortsModule(HeaderController *controller, char *param, int first) { - HeaderSmv* updated = accessHeader(controller,PORTS,0); - char* newName = addParams(updated->moduleName,param,"(",")"); - free(updated->moduleName); - updated->moduleName = newName; - // agora deve propagar as alterações para todos os demais módulos - if(!first){ - propagParamDependence(controller->MAIN_RELATED,param,controller->H_MAIN_CURRENT_SIZE); - } - propagParamDependence(controller->AUTOMATA_RELATED,param,controller->H_AUTOMATA_CURRENT_SIZE); -} - diff --git a/src/datastructures/STable.c b/src/datastructures/STable.c index 6e51741..94cfe9a 100644 --- a/src/datastructures/STable.c +++ b/src/datastructures/STable.c @@ -103,7 +103,7 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { newtable->backup = 0; newtable->collision = 0; newtable->conditionBind == NULL; - newtable->children = NULL; + newtable->parent = parent; /* @@ -112,7 +112,19 @@ STable* createTable(SCOPE_TYPE type, STable* parent, int level, int order) { } */ - int selectSize = type == SIMPLE_HASH ? MAX_SIMPLE : MAX_TABLE; + int selectSize = type == SIMPLE_HASH ? 15 : MAX_TABLE; + +/* + if(type == SIMPLE_HASH) + { + printf("[createTable] criando simple hash \n\n"); + } + else + { + printf("[createTable] criando escopo \n\n"); + } +*/ + newtable->tableData = (TableEntry**) malloc(selectSize*sizeof(TableEntry*)); @@ -189,8 +201,7 @@ void letgoTable(STable *t) free(t->children); } if(t->tableData){ - int size = t->type == SIMPLE_HASH ? MAX_SIMPLE : MAX_TABLE; - for(i=0; i < size; i++) + for(i=0; i < MAX_TABLE; i++) { if(t->tableData[i]) { letgoEntry(t->tableData[i]); diff --git a/src/langmodules/Object.c b/src/langmodules/Object.c index af91dfb..a72a1eb 100644 --- a/src/langmodules/Object.c +++ b/src/langmodules/Object.c @@ -205,14 +205,21 @@ void letgoObject(Object* o, int always) int i; for (i = 0; i < o->OBJECT_SIZE; i++) { - if(o->type != TYPE_SET || i < 2) - { - free(o->values[i]); // usar o free da tabela de simbolos na chamada anterior - } + if(o->type == TYPE_SET) + { + if(i < 2) + { + free(o->values[i]); // usar o free da tabela de simbolos para i == 3 (em outra localidade anteriormente) + } + } else if(o->type == TDS_ENTRY) { // TODO PARA TDS } + else + { + free(o->values[i]); + } } } } diff --git a/src/main.c b/src/main.c index 277ed0c..08c4809 100644 --- a/src/main.c +++ b/src/main.c @@ -40,19 +40,23 @@ int main(int argc, char* argv[]) { fclose(fp); // tabelas e componentes globais - HeaderController* controller = createController(); + HeaderController* controller = createController(5); + STable* global = createTable(GLOBAL,NULL,0,0); + STable* mainVarsTypeSmv = createTable(SMV_V_MAIN,NULL,0,0); + STable* portsTypeSmv = createTable(SMV_PORTS,NULL,0,0); + STable* writeSmvTypeTable[] = {mainVarsTypeSmv,portsTypeSmv}; //pré processamento - preProcessSmv(smvP, controller); -// setUpMainSmvTable(controller, NULL); + preProcessSmv(smvP,controller,writeSmvTypeTable); + setUpMainSmvTable(controller,writeSmvTypeTable,global); printf("--------------------------------- EVAL ---------------------------------------------\n"); printf("\n"); printf("\n"); //pos processamento - //eval(root,global,writeSmvTypeTable,controller); + eval(root,global,writeSmvTypeTable,controller); printf("\n"); printf("------------------------------------------------------------------------------\n"); @@ -62,18 +66,18 @@ int main(int argc, char* argv[]) { printf("\n"); printf("\n"); - printf("--------------------------------- PROGRAM TABLES ---------------------------------------------\n"); + printf("--------------------------------- TABLES ---------------------------------------------\n"); printTable(global); printf("\n"); - - printf("--------------------------------- smv-INFO TABLES ---------------------------------------------\n"); - - printTable(controller->mainInfo); + printTable(writeSmvTypeTable[0]); printf("\n"); - printTable(controller->portsInfo); + printTable(writeSmvTypeTable[1]); printf("\n"); + + + printf("\n"); printf("\n"); printf("\n"); @@ -81,12 +85,18 @@ int main(int argc, char* argv[]) { printf("--------------------------------- HEADERS ---------------------------------------------\n"); - printAllHeaders(controller); + + //printHeader(controller->headers[0]); + //printHeader(controller->headers[1]); + //printHeader(controller->headers[2]); + //printHeader(controller->headers[3]); +// printHeader(controller->headers[4]); if(!controller->declaredPorts){ fprintf(stderr, "[WARNING] THE MODEL GENERATION WAS SUCCESSFUL, HOWEVER NO TDS DEFINITION WAS FOUND \n IT IS RECOMENDED THAT YOU REVIEW YOUR .tds FILE \n"); } + writeResultantHeaders(controller,"results/newSmvfile.smv"); @@ -98,11 +108,12 @@ int main(int argc, char* argv[]) { // printf("teste TYPE SET !!! \n\n\n"); -// char* temp = controller->PORTS_RELATED[0]->varBuffer[1]; +// char* temp = controller->headers[4]->varBuffer[1]; // char* result = addParams(temp,"BATATA","{","}"); -// printf("%s\n",result); -// char* testAgain = addParams(result,"JUDGEMENT AHS COME TO YOU","{","}"); -// printf("%s\n",testAgain); +// printf("%s\n",result); +// char* testAgain = addParams(temp,"JUDGEMENT AHS COME TO YOU","{","}"); + +// printf("%s\n",testAgain); letGoHeaderControl(controller); From 1bb68b64b948d81abd29995a2c3a2c6a306cd607 Mon Sep 17 00:00:00 2001 From: Arch <33100644+mttorres@users.noreply.github.com> Date: Fri, 12 Feb 2021 22:19:15 -0300 Subject: [PATCH 30/30] =?UTF-8?q?Revert=20"Corre=C3=A7=C3=A3o=20de=20bug?= =?UTF-8?q?=20do=20addParams"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d99455c19f1fd39ca920deec227216a8fe241c4d. --- src/textManager.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/textManager.c b/src/textManager.c index 4b7fd92..b75ce63 100644 --- a/src/textManager.c +++ b/src/textManager.c @@ -11,8 +11,7 @@ char * customCat(char* dest, char* src, char toIgnore, int ignoreMode) { //printf("\t[customCat] source: %s \n\n\n",src); while(*dest){ - //printf("\t[customCat] %s \n",dest); - //*dest = '\0'; + //printf("\t[customCat] %s \n",dest); dest++; // vai para a "proxima posição disponivel" (no caso de strings usadas anteriormente por essa função só roda "uma vez") } while(*src){ @@ -87,16 +86,16 @@ char *addParams(char *original, char *param, char* delim1, char* delim2) { char *newString; int breakline=0; int statementEnd = 0; - int tamOriginal = strlen(original); - if(original[tamOriginal-1] == '\n'){ + if(original[strlen(original)-1] == '\n'){ breakline = 1; } //printf("aaaa: %c \n",original[strlen(original)-2]); - if(original[tamOriginal-2]== ';'){ + if(original[strlen(original)-2]== ';'){ statementEnd = 1; } - if(original[tamOriginal-3] == delim2[0] || original[tamOriginal-1] == delim2[0] || original[tamOriginal-2] == delim2[0]){ - newString = (char*) malloc(sizeof(char)*(strlen(original) +2+ strlen(param) +1)); // original + param + ',' + ' ' + '\0' + + if(statementEnd || original[strlen(original)-1] == delim2[0] || original[strlen(original)-2] == delim2[0]){ + newString = (char*) malloc(sizeof(char)*(strlen(original)+2+strlen(param)+1)); // original + param + ',' + ' ' + '\0' newString = customCat(newString,original,delim2[0],0); //printf("caso 1... %s \n",newString); newString = customCat(newString,", ",0,0); @@ -108,13 +107,8 @@ char *addParams(char *original, char *param, char* delim1, char* delim2) { } else { //printf("%ld %ld \n",strlen(original),strlen(param)); - newString = (char*) malloc(sizeof(char)*(strlen(original) + 1 + strlen(param) + 1 + 1)); // ( ) e \0 - if(statementEnd){ - newString = customCat(newString,original,';',0); - } - else{ - newString = customCat(newString,original,'\n',0); - } + newString = (char*) malloc(sizeof(char)*(strlen(original)+1+strlen(param)+1+1)); // ( , ) e \0 + newString = customCat(newString,original,'\n',0); newString = customCat(newString,delim1,0,0); newString = customCat(newString,param,0,0); newString = customCat(newString,delim2,0,0); @@ -126,7 +120,7 @@ char *addParams(char *original, char *param, char* delim1, char* delim2) { if(breakline){ newString = customCat(newString,"\n",0,0); } - newString = newString - ((strlen(original)+strlen(param)+2)-breakline); + newString = newString - ((strlen(original)+strlen(param)+2)-1); return newString; }