diff --git a/main.c b/main.c index 1709572..dea76ea 100644 --- a/main.c +++ b/main.c @@ -130,7 +130,7 @@ int main(int argc, char *argv[]) { TreeNode *ast = parse(arquivos[i], primeiro); /// recupera a árvore chamando o getToken() if(flags[1]) - printArvoreX(ast, arquivos[i]); + printArvoreX(ast, arquivos[i], 0); // 0 indica que a árvore é da análise sintática if(flags[2]) printArvoreT(ast, arquivos[i]); diff --git a/tree/tree.c b/tree/tree.c index 7df9308..44c415c 100644 --- a/tree/tree.c +++ b/tree/tree.c @@ -4,7 +4,7 @@ void printLabel1(TreeNode *node, FILE *treedot); void printLabel2(TreeNode *node, FILE *treedot); void printAresta(TreeNode *pai, TreeNode *filho, FILE *treedot); -char* criaComando(char cid, char *nomeArquivo) { +char* criaComando(char cid, char *nomeArquivo, char analise) { unsigned char i; char prog; @@ -19,14 +19,15 @@ char* criaComando(char cid, char *nomeArquivo) { i += 23; // 'rm file.tpp.dot .xdotwarning -f' } + i += 3; // mais três posições para guardar o '.ax' ou '.sx' char* comando = (char *) malloc(i*sizeof(char)); // aloca a quantidade necessária if(cid == 1) { - sprintf(comando, "%s.dot", nomeArquivo); + sprintf(comando, "%s.dot.%s", nomeArquivo, analise==0?"ax":"sx"); } else if(cid == 2) { - sprintf(comando, "xdot %s.dot 2>.xdotwarning", nomeArquivo); + sprintf(comando, "xdot %s.dot.%s 2>.xdotwarning", nomeArquivo, analise==0?"ax":"sx"); } else { - sprintf(comando, "rm %s.dot .xdotwarning -f", nomeArquivo); + sprintf(comando, "rm %s.dot.%s .xdotwarning -f", nomeArquivo, analise==0?"ax":"sx"); } return comando; @@ -122,11 +123,12 @@ void getArvoreRecursiva(TreeNode *pai, FILE *treedot) { getArvoreRecursiva(pai->filhos[i], treedot); } -void printArvoreX(TreeNode *raiz, char *nomeArquivo){ +// analise diz respeito ao tipo da arvore da analise, no caso, sintática ou semântica +void printArvoreX(TreeNode *raiz, char *nomeArquivo, char analise) { if(!raiz) return; - char* comando = criaComando(1, nomeArquivo); // retorna uma string com o nome do arquivo.dot + char* comando = criaComando(1, nomeArquivo, analise); // retorna uma string com o nome do arquivo.dot FILE *treedot = fopen(comando, "w"); // abrindo o arquivo fprintf(treedot, "strict graph G {\n"); // imprime cabeçalho @@ -139,9 +141,9 @@ void printArvoreX(TreeNode *raiz, char *nomeArquivo){ pid_t pid = fork(); // cria o processo filho if (pid < 0 || pid == 0) { // se deu erro, ou se é o processo filho - comando = criaComando(2, nomeArquivo); // cria o comando xdot file.dot ou rm file.dot + comando = criaComando(2, nomeArquivo, analise); // cria o comando xdot file.dot ou rm file.dot system(comando); // printa a arvore com o xdot - graphviz - comando = criaComando(3, nomeArquivo); // cria o comando rm file.dot + comando = criaComando(3, nomeArquivo, analise); // cria o comando rm file.dot system(comando); // apaga o arquivo do xdot exit(0); // não deve retornar, e sim sair } diff --git a/tree/tree.h b/tree/tree.h index b3c3a94..e7897a0 100644 --- a/tree/tree.h +++ b/tree/tree.h @@ -33,7 +33,10 @@ typedef struct TreeNode { TreeNode *novo_node(TokenRecord *token, EBNFType bnfval); // apenas aloca um novo nó e retorna TreeNode *remove_filho(TreeNode *pai); // remove o último filho e o retorna void insere_filho(TreeNode *pai, TreeNode *filho); // dado o pai, insere o filho na próximo local -void printArvoreX(TreeNode *raiz, char *nomeArquivo); // a partir deste nó, printa a árvore no xdot +// analise diz respeito ao tipo da arvore da analise, no caso, sintática ou semântica +// para adicionar um '.ax' ou '.as' no fim do nome do arquivo passado para o xdot, caso as duas árvores seja +// exibidas ao mesmo tempo +void printArvoreX(TreeNode *raiz, char *nomeArquivo, char analise); // a partir deste nó, printa a árvore no xdot void printArvoreT(TreeNode *raiz, char *nomeArquivo); // a partir deste nó, printa a árvore no terminal #endif \ No newline at end of file