-
Notifications
You must be signed in to change notification settings - Fork 0
/
scanner.l
94 lines (77 loc) · 2.41 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
/*
Grupo MLC - Lucas e Helena
*/
ALPHA [A-Za-z]
DIGIT [0-9]
INTEGER {-?{DIGIT}+}
%{
#include "comp_tree.h"
#include "comp_dict.h"
#include "parser.h" //arquivo automaticamente gerado pelo bison
#include <stdlib.h>
#include <stdio.h>
#include "symbtable.h"
#include "main.h"
int numLines = 1;
%}
%x IN_COMMENT
%%
<INITIAL>{
"/*" BEGIN(IN_COMMENT);
}
<IN_COMMENT>{
"*/" BEGIN(INITIAL);
[^*\n]+ // Eat comment in chunks
"*" // Eat the lone star
\n ++numLines;
}
"//".* { }
"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;
"," return ',';
";" return ';';
":" return ':';
"(" return '(';
")" return ')';
"[" return '[';
"]" return ']';
"{" return '{';
"}" return '}';
"+" return '+';
"-"/[^{DIGIT}] return '-';
"*" return '*';
"/" return '/';
"<" return '<';
">" return '>';
"=" return '=';
"!" return '!';
"&" return '&';
"$" return '$';
"<=" return TK_OC_LE;
">=" return TK_OC_GE;
"==" return TK_OC_EQ;
"!=" return TK_OC_NE;
"&&" return TK_OC_AND;
"||" return TK_OC_OR;
"false" {yylval.symbol = addSymbol(createIntToken(IKS_SIMBOLO_LITERAL_BOOL, 1), numLines); return TK_LIT_FALSE;}
"true" {yylval.symbol = addSymbol(createIntToken(IKS_SIMBOLO_LITERAL_BOOL, 0), numLines); return TK_LIT_TRUE;}
({ALPHA}|_)({ALPHA}|{DIGIT}|_)* {yylval.symbol = addSymbol(createToken(IKS_SIMBOLO_IDENTIFICADOR, yytext), numLines); return TK_IDENTIFICADOR;}
-?{DIGIT}+ {yylval.symbol = addSymbol(createIntToken(IKS_SIMBOLO_LITERAL_INT, atoi(yytext)), numLines); return TK_LIT_INT;}
-?{DIGIT}+"."{DIGIT}+ {yylval.symbol = addSymbol(createFltToken(IKS_SIMBOLO_LITERAL_FLOAT, atof(yytext)), numLines); return TK_LIT_FLOAT;}
"\'"."\'" {yylval.symbol = addSymbol(createChrToken(IKS_SIMBOLO_LITERAL_CHAR, yytext[1]), numLines); return TK_LIT_CHAR;}
\"(\\.|[^\\"])*\" {yylval.symbol = addSymbol(createStrToken(IKS_SIMBOLO_LITERAL_STRING, yytext), numLines); return TK_LIT_STRING;}
\n {++numLines;}
[ \t] { }
. {return TOKEN_ERRO;}
%%