summaryrefslogtreecommitdiff
path: root/lexical.c
diff options
context:
space:
mode:
Diffstat (limited to 'lexical.c')
-rw-r--r--lexical.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/lexical.c b/lexical.c
new file mode 100644
index 0000000..46ffffb
--- /dev/null
+++ b/lexical.c
@@ -0,0 +1,120 @@
+#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(fscanf(fp, "%c", &proximo) == EOF){
+ is_EOF = 1;
+ return ;
+ }
+ printf("%c", proximo);
+ if(proximo == '\n'){
+ PROXIMO(fp);
+ 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(){
+ fprintf(stderr, "Erro na linha %d\n", linha);
+ exit(1);
+}