aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/src/c_lexer.flex
blob: 8dcef35a1d3ece3bb48506cc2db10f9a231feb92 (plain)
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
%option noyywrap

%{

#include "c_parser.tab.hpp"

%}

IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*

ASSIGNMENT_OPERATOR (([<>][<>]|[*\/%+\-&^|])[=])

INTEGERSUFFIX ([uU][lL]|[lL][uU]|[uUlL])

DECIMALCONSTANT ([1-9][0-9]*)
OCTALCONSTANT ([0][0-7]*)
HEXCONSTANT ([0][xX][0-9A-Fa-f]+)

CHARCONSTANT ('(([\\]['])|([^']))+')

STRINGLITERAL ["](([\\]["])|([^"]))*["]

WHITESPACE [ \t\r\n]+

PREPROC [#][ ][0-9]+[ ]{STRINGLITERAL}[ 0-9]*

ALL .

%%

(void)		{ return T_VOID; }
(char)		{ return T_CHAR; }
(short)		{ return T_SHORT; }
(int)		{ return T_INT; }
(long)		{ return T_LONG; }
(float)		{ return T_FLOAT; }
(double)	{ return T_DOUBLE; }
(signed)	{ return T_SIGNED; }
(unsigned)	{ return T_UNSIGNED; }

(typedef)	{ return T_TYPEDEF; }
(extern)	{ return T_EXTERN; }
(static)	{ return T_STATIC; }
(auto)		{ return T_AUTO; }
(register)	{ return T_REGISTER; }

(const)		{ return T_CONST; }
(volatile)	{ return T_VOLATILE; }

(continue)	{ return T_CONTINUE; }
(break)		{ return T_BREAK; }
(goto)		{ return T_GOTO; }
(case)		{ return T_CASE; }
(default)	{ return T_DEFAULT; }
(switch)	{ return T_SWITCH; }

[.][.][.]	{ return T_ELLIPSIS; }
[;]		{ return T_SC; }
[,]		{ return T_CMA; }
[(]		{ return T_LRB; }
[)]		{ return T_RRB; }
[{]             { return T_LCB; }
[}]             { return T_RCB; }
[[]		{ return T_LSB; }
[]]		{ return T_RSB; }
[=]		{ yylval.string = new std::string(yytext); return T_EQ; }
{ASSIGNMENT_OPERATOR} { yylval.string = new std::string(yytext); return T_ASSIGN_OPER; }
[?]		{ return T_QU; }
[:]		{ return T_COL; }
[|][|]		{ return T_LOG_OR; }
[&][&]		{ return T_LOG_AND; }
[|]		{ return T_OR; }
[\^]		{ return T_XOR; }
[&]		{ yylval.string = new std::string(yytext); return T_AND; }
[=][=]		{ yylval.string = new std::string(yytext); return T_EQUALITY_OP; }
[!][=]		{ yylval.string = new std::string(yytext); return T_EQUALITY_OP; }
([<>][=])|[<>]	{ yylval.string = new std::string(yytext); return T_REL_OP; }
[<>][<>]	{ yylval.string = new std::string(yytext); return T_SHIFT_OP; }
[*] 		{ yylval.string = new std::string(yytext); return T_MULT; }
[\/]		{ yylval.string = new std::string(yytext); return T_DIV; }
[%]		{ yylval.string = new std::string(yytext); return T_REM; }
[~]		{ yylval.string = new std::string(yytext); return T_TILDE; }
[!]		{ yylval.string = new std::string(yytext); return T_NOT; }
[.]		{ return T_DOT; }
[-][>]		{ return T_ARROW; }
[+-][+-]	{ yylval.string = new std::string(yytext); return T_INCDEC; }
[+-]		{ yylval.string = new std::string(yytext); return T_ADDSUB_OP; }

if		{ return T_IF; }
else		{ return T_ELSE; }
return		{ return T_RETURN; }
while		{ return T_WHILE; }
do		{ return T_DO; }
for		{ return T_FOR; }
sizeof		{ return T_SIZEOF; }

{IDENTIFIER}	{ yylval.string = new std::string(yytext); return T_IDENTIFIER; }

({HEXCONSTANT}|{OCTALCONSTANT}|{DECIMALCONSTANT}){INTEGERSUFFIX}?	{ yylval.number = strtol(yytext, NULL, 0); return T_INT_CONST; }

{WHITESPACE}		{ ; }

.                   { fprintf(stderr, "Invalid token\n"); exit(1); }

%%

void yyerror(char const *s) {
     fprintf (stderr, "Parse error : %s\n", s);
     exit(1);
}