-
Notifications
You must be signed in to change notification settings - Fork 0
/
scanner.l
163 lines (144 loc) · 4.06 KB
/
scanner.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
%option yylineno noyywrap
%{
#include "utils/ast/ast.h"
#include "utils/check_error.h"
#include "parser.tab.h"
int get_line_number(void);
#define print_token(TOKEN) \
printf("Line: %d | Token identified: %s | Token: " #TOKEN "\n", get_line_number(), yytext);
%}
digit [0-9]
integer {digit}+
exponent [eE][+-]?(([1-9]{digit}*)+|[0]+[1-9]{digit}*)
float {integer}(("."{integer})|{exponent}|("."{integer}){exponent})
char \'(\\.|[^\\])\'
string \"([^"\\\n]|\\.)*\"
chars_after_literals [^_a-zA-Z0-9.]
letter [_a-zA-Z]
identifier {letter}({letter}|{digit})*
id_end [^a-zA-Z0-9_]
special_chars [\,\;\:\(\)\[\]\{\}\+\-\|\*\/\<\>\=\!\&\%\#\^\.\$\?]
/*Comentários*/
white_space [ \t\r\v\f]
multiline_comment \/\*[^*]*\*+(?:[^/*][^/*][^*]*\*+)*\/
double_slash \/\/
singleline_comment {double_slash}.*
start_multiline \/\*
all_except_asterisk [^*]
asterisk_without_slash \*+[^/*]
end_multiline (\*+\/)
simpler_multiline_comment {start_multiline}({all_except_asterisk}|{asterisk_without_slash})*{end_multiline}
%x ERROR_STATE
%%
/* RESERVED WORDS */
int { return TK_PR_INT; }
float { return TK_PR_FLOAT; }
bool { return TK_PR_BOOL; }
char { return TK_PR_CHAR; }
string { return TK_PR_STRING; }
if { return TK_PR_IF; }
then { return TK_PR_THEN; }
else { return TK_PR_ELSE; }
while { return TK_PR_WHILE; }
do { return TK_PR_DO; }
input {return TK_PR_INPUT; }
output { return TK_PR_OUTPUT; }
return { return TK_PR_RETURN; }
const { return TK_PR_CONST; }
static { return TK_PR_STATIC; }
foreach { return TK_PR_FOREACH; }
for { return TK_PR_FOR; }
switch { return TK_PR_SWITCH; }
case { return TK_PR_CASE; }
break { return TK_PR_BREAK; }
continue { return TK_PR_CONTINUE; }
class { return TK_PR_CLASS; }
private { return TK_PR_PRIVATE; }
public { return TK_PR_PUBLIC; }
protected { return TK_PR_PROTECTED; }
end { return TK_PR_END; }
default { return TK_PR_DEFAULT; }
/* TYPE LITERALS */
{integer}/{chars_after_literals} {
yylval.lexical_value = create_integer(atoi(yytext), get_line_number());
return TK_LIT_INT;
}
{float}/{chars_after_literals} {
yylval.lexical_value = create_float(atof(yytext), get_line_number());
return TK_LIT_FLOAT;
}
false {
yylval.lexical_value = create_bool(false, get_line_number());
return TK_LIT_FALSE;
}
true {
yylval.lexical_value = create_bool(true, get_line_number());
return TK_LIT_TRUE;
}
{string}/{chars_after_literals} {
yylval.lexical_value = create_string(strdup(yytext), get_line_number());
return TK_LIT_STRING;
}
{char}/{chars_after_literals} {
yylval.lexical_value = create_char(strdup(yytext), get_line_number());
return TK_LIT_CHAR;
}
/* SPECIAL CHARACTERS - e.g. ,;:() */
{special_chars} {return yytext[0]; }
/* SPECIAL/COMPOSITE OPERATORS */
"<=" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_LE;
}
">=" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_GE;
}
"==" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_EQ;
}
"!=" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_NE;
}
"&&" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_AND;
}
"||" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_OR;
}
">>" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_SR;
}
"<<" {
yylval.lexical_value = create_compound_op(strdup(yytext), get_line_number());
return TK_OC_SL;
}
/* IDENTIFIER */
{identifier} {
yylval.lexical_value = create_identifier(strdup(yytext), get_line_number());
return TK_IDENTIFICADOR;
}
/* COMMENTS AND CHARACTERS TO IGNORE */
{simpler_multiline_comment} {}
{singleline_comment} {}
{white_space}+ {}
\n {}
/* ERROR IF NO PATTERN MATCHED */
. {
yyless(0);
BEGIN(ERROR_STATE);
}
/*When in error state, grab all chars until the end of the line or ;*/
<ERROR_STATE>[^ \n;]* {
BEGIN(INITIAL);
return TOKEN_ERRO;
}
%%
int get_line_number(void) {
return yylineno;
}