summaryrefslogtreecommitdiff
path: root/lexical.c
blob: 22d219bcc033db0a6d7e3d47b2eaf96f367c8774 (plain)
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);
}