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
|
#include <stdio.h>
#include <stdlib.h>
#include "include/map.h"
#include "include/lexical.h"
char proximo = '\n';
int is_EOF = 0;
int linha = 1; // Numero da linha atual)
int identificador_num = 1;
string_map special_char;
string_map simbolos_especiais;
string_map simbolos_especiais_composto;
string_map simbolos_especiais_composto_negrito;
string_map simbolos_identificadores;
string_map simbolos_numeros;
void init_simbolos_especiais_compostos_negrito(){
simbolos_especiais_composto_negrito = init_map(1031);
insert_map("program", "secn01", simbolos_especiais_composto_negrito);
insert_map("label", "secn02", simbolos_especiais_composto_negrito);
insert_map("var", "secn03", simbolos_especiais_composto_negrito);
insert_map("procedure", "secn04", simbolos_especiais_composto_negrito);
insert_map("function", "secn05", simbolos_especiais_composto_negrito);
insert_map("begin", "secn06", simbolos_especiais_composto_negrito);
insert_map("end", "secn07", simbolos_especiais_composto_negrito);
insert_map("if", "secn08", simbolos_especiais_composto_negrito);
insert_map("then", "secn09", simbolos_especiais_composto_negrito);
insert_map("else", "secn10", simbolos_especiais_composto_negrito);
insert_map("while", "secn11", simbolos_especiais_composto_negrito);
insert_map("do", "secn12", simbolos_especiais_composto_negrito);
insert_map("or", "secn13", simbolos_especiais_composto_negrito);
insert_map("and", "secn14", simbolos_especiais_composto_negrito);
insert_map("div", "secn15", simbolos_especiais_composto_negrito);
insert_map("not", "secn16", simbolos_especiais_composto_negrito);
}
void init_simbolos_especiais_compostos(){
simbolos_especiais_composto = init_map(1031);
insert_map(":=", "sec1", simbolos_especiais_composto);
insert_map("(*", "sec2", simbolos_especiais_composto);
insert_map("*)", "sec3", simbolos_especiais_composto);
}
int is_caracter(char tmp){
return (tmp >= 'a' && tmp <= 'z');
}
int is_numero(char tmp){
return (tmp >= '0' && tmp <= '9');
}
void init_simbolos_especiais(){
simbolos_especiais = init_map(1031);
insert_map(".", "se01", simbolos_especiais);
insert_map(";", "se02", simbolos_especiais);
insert_map(",", "se03", simbolos_especiais);
insert_map("(", "se04", simbolos_especiais);
insert_map(")", "se05", simbolos_especiais);
insert_map(":", "se06", simbolos_especiais);
insert_map("=", "se07", simbolos_especiais);
insert_map("<", "se08", simbolos_especiais);
insert_map(">", "se09", simbolos_especiais);
insert_map("+", "se10", simbolos_especiais);
insert_map("-", "se11", simbolos_especiais);
insert_map("*", "se12", simbolos_especiais);
}
void init_all_map(){
init_simbolos_especiais();
init_simbolos_especiais_compostos();
init_simbolos_especiais_compostos_negrito();
simbolos_identificadores = init_map(1031);
simbolos_numeros = init_map(1031);
}
void PROXIMO(FILE *fp){
if(is_EOF) return;
if(fscanf(fp, "%c", &proximo) == EOF){
is_EOF = 1;
return ;
}
if(proximo == '\n'){
printf("\n");
PROXIMO(fp);
linha++;
printf("linha %d: ", linha);
}
return ;
}
char* CODIGO(char *cod){
char *tmp;
if((tmp = get_value(cod, simbolos_especiais)) != NULL){
return tmp;
}
if((tmp = get_value(cod, simbolos_especiais_composto)) != NULL){
return tmp;
}
if((tmp = get_value(cod, simbolos_especiais_composto_negrito)) != NULL){
return tmp;
}
if((tmp = get_value(cod, simbolos_numeros)) != NULL){
return tmp;
}
if((tmp = get_value(cod, simbolos_identificadores)) != NULL){
return tmp;
}
return NULL;
}
void ERRO(int error_code){
fprintf(stderr, "Erro na linha %d\n", linha);
if(error_code == 1) fprintf(stderr, "primerio erro\n");
else fprintf(stderr, "segundo erro\n");
exit(1);
}
|