Skip to content

Commit

Permalink
nome do arquivo do xdot de acordo com a análise
Browse files Browse the repository at this point in the history
Se a análise for a sintática, o arquivo passado ao xdot se chamara filename.dot.ax; se for semântica, filename.dot.as
  • Loading branch information
DanielVenturini committed Oct 30, 2018
1 parent 915b140 commit 70a8ce7
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 10 deletions.
2 changes: 1 addition & 1 deletion main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]);

Expand Down
18 changes: 10 additions & 8 deletions tree/tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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
Expand All @@ -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
}
Expand Down
5 changes: 4 additions & 1 deletion tree/tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 70a8ce7

Please sign in to comment.