-
Notifications
You must be signed in to change notification settings - Fork 1
/
buffer.h
142 lines (105 loc) · 4.79 KB
/
buffer.h
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
/*------------------------------------------------------------------------------
"buffer.h"
----------
- Introdução.:
--------------
No arquivo "buffer.h" contem os procedimentos de controle
e armazenamento, tambem as variaveis que serão utilizadas.
Para que o Analizador Léxico possa varrer todo o arquivo e
retornar os tokens encontrados...
- void arquivo.:
----------------
Tem a finalidade de abrir um arquivo para leitura
e armazenar todo o conteúdo do arquivo em um vetor e
finalizando com '\0'.
- char ProximoCaracter.:
------------------------
Tem a finalidade de fazer a leitura do vetor e retornar o
próximo caracter armazenado no vetor.
- typedef struct token.:
------------------------
É criado um registro do tipo token, no qual irá armazenar as
informasões dos tokens encontrados no arquivo como:
- Classe .: Para que classe o token pertence.
- Valor .: Lexema encontrado.
- PosicaoL.: Em que linha foi encontrado.
- Obs.: O vetor está sendo alocado dinamicamente com o
tamanho do arquivo, para que não haja desperdiço de
espaço na memória.
------------------------------------------------------------------------------*/
/*---------------------Declaração de bibliotecas------------------------------*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
using namespace std;
/*----------------------------------------------------------------------------*/
/*---------------------------Definindo tipo-----------------------------------*/
typedef struct token {
int classe;//Classe do token
char valor[100];//Lexema
int posicaoL;//Linha do lexema
}token;
/*----------------------------------------------------------------------------*/
/*-------------------------Declarando variaveis-------------------------------*/
char c;//Recebe o caracter para ser analizado
int linha = 1;//Contador de linha
int InicioDeLexema = 0;//Ponteiro para localizar o início do Lexema
int ApontadorAdiante = 0;//Ponteiro para localizar o fim do Lexema
char *vetor;//Ponteiro para o vetor que armazena o arquivo
/*----------------------------------------------------------------------------*/
/*------------------------Inicio void arquivo---------------------------------*/
char arquivo(char* nome_arquivo)
{
FILE *arquivo;//Ponteiro do arquivo
char letra;//Recebe caracteres lido do arquivo
int bloco = 0;//Contador de coluna
int aux=0;//Auxilia na inserção de dados no vetor
//Abre o arquivo somente para leitura
/*-------------------------------------------
Se o arquivo não for encontrado ou não puder
se aberto retornara um mensagem de erro
--------------------------------------------*/
if((arquivo = fopen(nome_arquivo,"r")) == NULL){
cout << ":.Erro na Abertura do Arquivo.:" << endl;
cout << "Verifique se o endereco do arquivo foi degitado corretamente" << endl;
}
//L� caracter por caracter do arquivo
while((letra = getc(arquivo)) != EOF)
{
bloco++;//Conta quantos caracter contem no arquivo...
}
/*--------------------------------------------
Alocando vetor dinamicamente com a quantidade
de caracter que contem no arquivo
--------------------------------------------*/
vetor = new char[bloco];
//Limpando o vetor
for(int l = 0; l < bloco; l++)
vetor[l] = NULL;
//Retorna o ponteiro ao início do arquivo
rewind(arquivo);
//Lê caracter por caracter do arquivo
while((letra = getc(arquivo)) != EOF)
{
//Insere caracter por caracter no vetor
vetor[aux] = letra;
aux++;//Próxima posição do vetor
}
//Insere '\0' no final do vetor para
//que possa identificar o final.
vetor[bloco] = '\0';
//Fecha o arquivo
fclose(arquivo);
}
/*---------------------------Fim void arquivo---------------------------------*/
/*---------------------Inicio void ProximoCaracter----------------------------*/
char ProximoCaracter ( )
{
c = vetor[ApontadorAdiante++];//Incremento da posição do vetor
if (c == '\n')
linha++;
return c;//Retorna o caracter do vetor
}
/*------------------------Fim void ProximoCaracter----------------------------*/