-
Notifications
You must be signed in to change notification settings - Fork 2
/
jogol.l
86 lines (61 loc) · 1.77 KB
/
jogol.l
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
%{
#include "acoes.h"
#include "jogo.tab.h"
/* Para readline */
#include <readline/readline.h>
#include <readline/history.h>
/* Redefinição da entrada do Flex para usar o readline */
#define YY_INPUT(buf,result,max_size) result = mygetinput(buf, max_size);
/* Função que substitui a entrada */
static int mygetinput(char *buf, int size) {
char *line;
/* final de arquivo */
if (feof(yyin)) return YY_NULL;
/* Lê uma linha, com o prompt "> " */
line = readline("> ");
if(!line) return YY_NULL;
/* segurança */
if(strlen(line) > size-2){
fprintf(stderr,"input line too long\n");
return YY_NULL;
}
/* copia para o buffer de enrtada */
sprintf(buf,"%s\n",line);
/* adiciona ao histórico */
add_history(line);
/* libera memória */
free(line);
return strlen(buf);
}
%}
/* Não importa se maiúsculas ou minúsculas */
%option caseless
/* em unicode, á são dois caracteres, veja as regras para INVENT e VAPARA */
%%
(fim|Chega) { return FIM;}
<<EOF>> { puts("Bye bye..."); return FIM; }
i(nvent((a|á|Á)rio)?)? { return INVENT;}
v(á|Á|a)[[:space:]]+para {
return VAPARA;}
(N|Norte|NORTE) { return NORTE;}
(S|Sul|SUL) { return SUL;}
(L|Leste|LESTE) { return LESTE;}
(W|Oeste|OESTE) { return OESTE; /* W no lugar de O para evitar confusão com o artigo 'o'*/ }
[ao]|uma?
d[aoe]|em|n[ao]
[[:alpha:]]+ {
/* identificador */
int tipo;
if ((tipo = LBuscaTipoGlobal(sym_table, yytext)) != -1) {
yylval.tptr = LBuscaGlobal(sym_table, yytext, 'N');
//printf("estou retornando %d\n", tipo);
return tipo;
}
else {
yylval.str = yytext;
return DESC;
}
}
[ \t]+
[\n;] {/* ';' também termina linhas */return EOL;}
. {yylval.str = yytext; return DESC;}