-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy patharquivo.c
146 lines (123 loc) · 3.57 KB
/
arquivo.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
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "arquivo.h"
#include "sistema.h"
#define MAX 1000
// Le o alfabeto do arquivo (primeira linha)
// Entrada: nenhuma
// Retorno: vetor contendo o alfabeto
// Pre-condicao: primeira linha no formato "alfabeto={a,b,c}"
// Pos-condicao: nenhuma
char* ler_alfabeto(char* buff) {
char *c;
char *alfabeto = malloc(sizeof(char) * 100);
char* buff_copia = strdup(buff);
int i;
c = buff_copia + 9;
c = strtok (buff_copia, ",{}");
c = strtok (NULL, ",{}");
for(i = 0; c != NULL; i++) {
alfabeto[i] = *c;
c = strtok (NULL, ",{}");
}
alfabeto[i-1] = 0;
free(buff_copia);
return alfabeto;
}
// Le os estados do arquivo (segunda linha)
// Entrada: nenhuma
// Retorno: vector contendo os estados
// Pre-condicao: segunda linha no formato "estados={q0,q1,q2}"
// Pos-condicao: nenhuma
int* ler_estados(char* buff) {
char *c;
int estado, i;
int *estados = malloc(sizeof(int) * 100);
char* buff_copia = strdup(buff);
c = buff_copia + 8;
c = strtok (buff_copia, ",{}q");
c = strtok (NULL, ",{}q");
for(i = 0; c != NULL; i++) {
estado = *c - '0';
estados[i] = estado;
c = strtok (NULL, ",{}q");
}
estados[i-1] = -1;
free(buff_copia);
return estados;
}
// Le os estados finais do arquivo (terceira linha)
// Entrada: nenhuma
// Retorno: vector contendo os estados finais
// Pre-condicao: terceira linha no formato "finais={q3,q4}"
// Pos-condicao: nenhuma
int* ler_finais(char* buff) {
char *c;
int final, i;
int *finais = malloc(sizeof(int) * 100);
char* buff_copia = strdup(buff);
c = buff_copia + 8;
c = strtok (buff_copia, ",{}q");
c = strtok (NULL, ",{}q");
for(i = 0; c != NULL; i++) {
final = *c - '0';
finais[i] = final;
c = strtok (NULL, ",{}q");
}
finais[i-1] = -1;
free(buff_copia);
return finais;
}
// Le as transicoes nas linhas seguintes do arquivo e guarda na estrutura de gramatica
// Entrada: estrutura onde sera guardada
// Retorno: nova estrutura pre carregada
// Pre-condicao: linhas de transicao no formato "(q1,a)=q1"
// Pos-condicao: nenhuma
GRAMATICA* formar_gramatica(char *arquivo) {
char buff[MAX];
char *c;
int estado_origem;
char simbolo;
int estado_destino;
FILE *fin = fopen(arquivo, "r");
if (fin == NULL) {
printf("(Erro ao abrir o arquivo)\n");
return NULL; // Saída com erro
}
fgets(buff, MAX, fin);
char *alfabeto = ler_alfabeto(buff);
fgets(buff, MAX, fin);
int *estados = ler_estados(buff);
int tamanho = contar_tamanho_vetor(estados);
fgets(buff, MAX, fin);
int *finais = ler_finais(buff);
tamanho = contar_tamanho_vetor(finais);
GRAMATICA *gramatica = criar_gramatica(alfabeto, estados, finais);
fgets(buff, MAX, fin);
while (!feof(fin)) { // enquanto nao for fim de arquivo
c = buff + 2;
estado_origem = *c - '0';
c = c + 2;
simbolo = *c;
c = c + 5;
estado_destino = *c - '0';
if(inserir_transicao(gramatica, estado_origem, estado_destino, simbolo))
return NULL;
fgets(buff, MAX, fin);
}
c = buff + 2;
estado_origem = *c - '0';
c = c + 2;
simbolo = *c;
c = c + 5;
estado_destino = *c - '0';
if(inserir_transicao(gramatica, estado_origem, estado_destino, simbolo))
return NULL;
printf("\n(AFD carregado)\n");
fclose(fin);
free(alfabeto);
free(estados);
free(finais);
return gramatica;
}