-
Notifications
You must be signed in to change notification settings - Fork 2
/
decaf.l
118 lines (106 loc) · 4.02 KB
/
decaf.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
%{
#include "include/head.h" // Include some C++ headers
#include "include/ast.h" // AST's interfaces
#include "tok.h" // Header containing the tokens generated by bison parser
int yyerror(string s);
%}
/* Read only one input file */
%option noyywrap
SINGLE_QUOTES "\'"
DOUBLE_QUOTES "\""
COLON ":"
SEMICOLON ";"
COMMA ","
OPENROUND "\("
CLOSEROUND "\)"
OPENSQUARE "\["
CLOSESQUARE "\]"
OPENCURLY "\{"
CLOSECURLY "\}"
WHITESPACES [ \t]+
CHAR [^\n]
CHAR_LITERAL {SINGLE_QUOTES}{CHAR}{SINGLE_QUOTES}
STRING_LITERAL \"(\\.|[^"])*\"
/* Regular Expressions related to special characters */
BING "!"
PLUS "+"
MINUS "-"
UNARY '-'
MULT "\*"
DIV "/"
MOD "%"
AND "&&"
OR "||"
ASSIGN "="
MULTASSIGN "\*="
DIVASSIGN "\\="
MODASSIGN "%="
PLUSASSIGN "+="
MINUSASSIGN "-="
EQ "=="
NEQ "!="
GT ">"
LT "<"
GTEQ ">="
LTEQ "<="
/* Regular Expressions related to handling numbers */
DIGIT [0-9]
DEC_LITERAL {DIGIT}+
HEX_LITERAL 0[xX][{DIGIT}a-fA-F]+
/* Regular Expressions related to handling names */
CALLOUT "callout"
HEADER "class Program"
VOID "void"
IF "if"
ELSE "else"
RETURN "return"
BREAK "break"
CONTINUE "continue"
FOR "for"
ID [A-Za-z_][A-Za-z{DIGIT}_]*
/* Regular Expressions related to handling types */
INTEGER "int"
BOOLEAN "boolean"
TRUE "true"
FALSE "false"
%%
{INTEGER} { yylval.strVal = new string(yytext); return TYPES; }
{BOOLEAN} { yylval.strVal = new string(yytext); return TYPES; }
{TRUE} { yylval.strVal = new string(yytext); return BOOL_LITERAL; }
{FALSE} { yylval.strVal = new string(yytext); return BOOL_LITERAL; }
{PLUS} { yylval.strVal = new string(yytext); return PLUS; }
{MINUS} { yylval.strVal = new string(yytext); return MINUS; }
{UNARY} { yylval.strVal = new string(yytext); return UNARY; }
{MULT} { yylval.strVal = new string(yytext); return MULT; }
{DIV} { yylval.strVal = new string(yytext); return DIV; }
{MOD} { yylval.strVal = new string(yytext); return MOD; }
{AND} { yylval.strVal = new string(yytext); return AND; }
{OR} { yylval.strVal = new string(yytext); return OR; }
{ASSIGN} { yylval.strVal = new string(yytext); return ASSIGN; }
{PLUSASSIGN} { yylval.strVal = new string(yytext); return PLUSASSIGN; }
{MINUSASSIGN} { yylval.strVal = new string(yytext); return MINUSASSIGN; }
{NEQ} { yylval.strVal = new string(yytext); return NEQ; }
{EQ} { yylval.strVal = new string(yytext); return EQ; }
{GTEQ} { yylval.strVal = new string(yytext); return GTEQ; }
{LTEQ} { yylval.strVal = new string(yytext); return LTEQ; }
{GT} { yylval.strVal = new string(yytext); return GT; }
{LT} { yylval.strVal = new string(yytext); return LT; }
{BING} { yylval.strVal = new string(yytext); return BING; }
{DEC_LITERAL} { yylval.intVal = atoi(yytext); return DEC_LITERAL; }
{HEX_LITERAL} { sscanf(yytext, "%d", &yylval.intVal); return HEX_LITERAL; }
{CALLOUT} { return CALLOUT; }
{HEADER} { return HEADER; }
{VOID} { return VOID; }
{IF} { return IF; }
{ELSE} { return ELSE; }
{FOR} { return FOR; }
{RETURN} { return RETURN; }
{BREAK} { return BREAK; }
{CONTINUE} { return CONTINUE; }
{ID} { yylval.strVal = new string(yytext); return ID; }
{WHITESPACES} { }
[\n] { yylineno++; }
{CHAR_LITERAL} { yylval.strVal = new string(yytext); return CHAR_LITERAL; }
{STRING_LITERAL} { yylval.strVal = new string(yytext); return STRING_LITERAL; }
. { return yytext[0]; }
%%