-
Notifications
You must be signed in to change notification settings - Fork 0
/
arvore.c
136 lines (117 loc) · 2.58 KB
/
arvore.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Desenvolvido por: William Rodrigues @ UEM 2020. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "arvore.h"
#include "sintatico.tab.h"
void yyerror(char *);
/* Cria novo No*/
struct no *novo_no(int tipo, struct no *l, struct no *r, int linha, int coluna){
struct no *no = malloc(sizeof(struct no));
if (!no) {
yyerror("out of space");
exit(0);
}
no->tipo = tipo;
no->l = l;
no->r = r;
no->linha = linha;
no->coluna = coluna;
return no;
}
struct no *novo_no_folha_int(int valor, int linha, int coluna){
struct no_folha *no = malloc(sizeof(struct no_folha));
if (!no) {
yyerror("out of space");
exit(0);
}
no->tipo = NUM_INT;
no->valor.inteiro = valor;
no->linha = linha;
no->coluna = coluna;
return (struct no *)no;
}
struct no *novo_no_folha_float(float valor, int linha, int coluna){
struct no_folha *no = malloc(sizeof(struct no_folha));
if (!no) {
yyerror("out of space");
exit(0);
}
no->tipo = NUM_FLOAT;
no->valor.real = valor;
no->linha = linha;
no->coluna = coluna;
return (struct no *)no;
}
struct no *novo_no_folha_id(char* valor, int linha, int coluna){
struct no_folha *no = malloc(sizeof(struct no_folha));
if (!no) {
yyerror("out of space");
exit(0);
}
no->tipo = ID;
no->valor.string = valor;
no->linha = linha;
no->coluna = coluna;
return (struct no *)no;
}
/* Print No */
void print_no(struct no *no){
switch(no->tipo) {
case ADD:
print_no(no->l);
printf("+");
print_no(no->r);
break;
case SUB:
print_no(no->l);
printf("-");
print_no(no->r);
break;
case MUL:
print_no(no->l);
printf("*");
print_no(no->r);
break;
case DIV:
print_no(no->l);
printf("/");
print_no(no->r);
break;
case POW:
print_no(no->l);
printf("^");
print_no(no->r);
break;
case NUM_INT:
printf("%d", ((struct no_folha *)no)->valor.inteiro);
break;
case NUM_FLOAT:
printf("%.2f", ((struct no_folha *)no)->valor.real);
break;
case ID:
printf("%s", ((struct no_folha *)no)->valor.string);
break;
default:
printf("\nErro interno: tipo de no desconhecido");
}
}
/* Arvore sintatica (lista de nos) */
struct arvore_sintatica * novo_arvore_sintatica(int tipo, struct no* exp, char* id, struct arvore_sintatica* anterior){
struct arvore_sintatica * novo = malloc(sizeof(struct arvore_sintatica));
novo->tipo = tipo;
novo->exp = exp;
if(tipo == 2){
novo->id = id;
}
novo->next = NULL;
if (anterior){
anterior->next = novo;
}else{
inicio_lista_arvore = novo;
}
return novo;
}
struct arvore_sintatica * get_inicio_lista_arvore(){
return inicio_lista_arvore;
}