-
Notifications
You must be signed in to change notification settings - Fork 0
/
scanner.l
94 lines (74 loc) · 1.73 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
/* MIGHT NEED CHANGING WHEN ADDING INSTRUCTIONS */
%option noyywrap
%{
#include "globals.h"
#include "util.h"
#include "scan.h"
char tokenString[MAXTOKENLEN+1];
extern int yylex(void);
%}
DIGITO [0-9]
LETRA [a-zA-Z]
whitespace [ \t\r]+
%%
{whitespace} {}
"+" {return SOM;}
"-" {return SUB;}
"*" {return MUL;}
"/" {return DIV;}
"%" {return MOD;}
"=" {return ATRIBUI;}
"," {return VIR;}
";" {return PV;}
"(" {return APR;}
")" {return FPR;}
"[" {return ACO;}
"]" {return FCO;}
"{" {return ACH;}
"}" {return FCH;}
"/*" {
char c;
while(1){
c = input();
if(c==EOF) break;
if(c=='\n') lineno++;
if(c=='*'){
c = input();
if(c=='/') break;
}
}
}
\n {lineno++;}
"if" {return IF;}
"else" {return ELSE;}
"int" {return INT;}
"return" {return RET;}
"void" {return VOID;}
"while" {return WHILE;}
"<" {return LT;}
"<=" {return LTE;}
">" {return GT;}
">=" {return GTE;}
"==" {return CMP;}
"!=" {return DIF;}
{DIGITO}+ {return NUM;}
({LETRA}|_)({LETRA}|_|{DIGITO})* {return ID;}
. {return ERR;}
%%
TokenType getToken(void){
static int firstTime = TRUE;
TokenType currentToken;
if(firstTime){
firstTime = FALSE;
lineno++;
yyin = source;
yyout = listing;
}
currentToken = yylex();
strncpy(tokenString,yytext,MAXTOKENLEN);
if(TraceScan){
fprintf(listing,"\t%d: ",lineno);
printToken(currentToken,tokenString);
}
return currentToken;
}