-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtokens.l
110 lines (90 loc) · 2.55 KB
/
tokens.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
%{
#include "ast/ast.h"
#include "parser.hpp"
void yyerror(const char *);
int tmp = 0;
std::string buf;
%}
%x COMMENT CADEIA RCHAR ESCP ENDCHAR
%%
[ \t\n] {
if(strcmp(yytext, "\n") == 0){
yylineno++;
}
}
"(" return *yytext;
")" return *yytext;
"[" return *yytext;
"]" return *yytext;
"{" return *yytext;
"}" return *yytext;
">=" return GEQ;
"<=" return LEQ;
">" return *yytext;
"<" return *yytext;
"==" return EQUAL;
"!=" return DIF;
"+" return *yytext;
"-" return *yytext;
"/" return *yytext;
"!" return *yytext;
"%" return *yytext;
"*" return *yytext;
"e" return *yytext;
"ou" return OR;
"?" return *yytext;
":" return *yytext;
"=" return *yytext;
"entao" return ENTAO;
"se" return SE;
"retorne" return RETURN;
"senao" return SENAO;
"leia" return LEIA;
"escreva" return ESCREVA;
"novalinha" return NOVALINHA;
"enquanto" return ENQUANTO;
"execute" return EXECUTE;
";" return *yytext;
"programa" return PROGRAMA;
"," return *yytext;
"int"|"car" {yylval.tval = new std::string(yytext); return TIPO;}
[a-zA-Z_][a-zA-Z0-9_]* {yylval.tval = new std::string(yytext); return ID;}
[0-9]+ {yylval.tval = new std::string(yytext); return INTCONST;}
\" { BEGIN CADEIA; buf = "";}
<CADEIA>\" { BEGIN INITIAL; yylval.tval = new std::string(buf); return STRING; }
<CADEIA>\n { yylineno++; yyerror("CADEIA DE CARACTERES OCUPA MAIS DE UMA LINHA"); }
<CADEIA>{
"\\n" { buf += '\n'; }
"\\t" { buf += '\t'; }
"\\a" { buf += '\a'; }
"\\r" { buf += '\r'; }
"\\b" { buf += '\b'; }
"\\f" { buf += '\f'; }
"\\\"" { buf += '\\'; }
}
<CADEIA><<EOF>> { yyerror("STRING NAO TERMINA."); }
<CADEIA>. { buf += *yytext;}
"/*" { BEGIN COMMENT; }
<COMMENT>"*"+"/" { yylineno += tmp;
tmp = 0;
BEGIN INITIAL; }
<COMMENT>"*"+[^*/\n] {;}
<COMMENT>\n { tmp++; }
<COMMENT>[^*\n] {;}
<COMMENT><<EOF>> { yyerror("COMENTARIO NAO TERMINA."); }
' { BEGIN RCHAR; }
<RCHAR>\\ { BEGIN ESCP; }
<RCHAR>. { buf = ""; buf += *yytext; BEGIN ENDCHAR; }
<ESCP>{
[0ntarbf\\'] { buf = "\\"; buf += *yytext; BEGIN ENDCHAR; }
}
<ESCP>. { yyerror( "FALTANDO DELIMITADOR ' EM CONSTANTE TIPO char." ); }
<ENDCHAR>' { BEGIN INITIAL; yylval.tval = new std::string(yytext); return LITCHAR; }
<ENDCHAR>. { yyerror( "FALTANDO DELIMITADOR ' EM CONSTANTE TIPO char." ); };
. {
yyerror("CARACTERE INVÁLIDO.");
}
%%
int yywrap(){
return 1;
}