-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathflex_c.l
124 lines (112 loc) · 2.7 KB
/
flex_c.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
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bison_c.tab.h"
#include "ast_node.h"
FILE *yyin;
int linesno = 1;
void comment();
void ignoreHeadfile();
%}
digit [0-9]
number ("+"|"-")?{digit}+
letter [a-zA-Z_]
identifier {letter}({letter}|{digit})*
%%
"/*" { comment(); }
"//".* { /*ignore comment*/ }
"auto" { return AUTO; }
"break" { return BREAK; }
"case" { return CASE; }
"char" { return CHAR; }
"define" { return DEFINE; }
"continue" { return CONTINUE; }
"default" { return DEFAULT; }
"do" { return DO; }
"double" { return DOUBLE; }
"else" { return ELSE; }
"enum" { return ENUM; }
"extern" { return EXTERN; }
"float" { return FLOAT; }
"for" { return FOR; }
"goto" { return GOTO; }
"if" { return IF; }
"int" { return INT; }
"long" { return LONG; }
"register" { return REGISTER; }
"return" { return RETURN; }
"short" { return SHORT; }
"signed" { return SIGNED; }
"sizeof" { return SIZEOF; }
"static" { return STATIC; }
"struct" { return STRUCT; }
"switch" { return SWITCH; }
"typedef" { return TYPEDEF; }
"union" { return UNION; }
"unsigned" { return UNSIGNED; }
"void" { return VOID; }
"volatile" { return VOLATILE; }
"while" { return WHILE; }
"+=" { return ADD_ASSIGN; }
"-=" { return SUB_ASSIGN; }
"*=" { return MUL_ASSIGN; }
"/=" { return DIV_ASSIGN; }
"++" { return INC_OP; }
"--" { return DEC_OP; }
"&&" { return AND_OP; }
"||" { return OR_OP; }
"<=" { return LE_OP; }
">=" { return GE_OP; }
"==" { return EQ_OP; }
"!=" { return NE_OP; }
";" { return ';'; }
"{" { return '{'; }
"}" { return '}'; }
"," { return ','; }
":" { return ':'; }
"=" { return '='; }
"(" { return '('; }
")" { return ')'; }
"[" { return '['; }
"]" { return ']'; }
"." { return '.'; }
"&" { return '&'; }
"!" { return '!'; }
"~" { return '~'; }
"-" { return '-'; }
"+" { return '+'; }
"*" { return '*'; }
"/" { return '/'; }
"%" { return '%'; }
"<" { return '<'; }
">" { return '>'; }
"^" { return '^'; }
"|" { return '|'; }
"?" { return '?'; }
{number}("."{digit})? { yylval.d = atof(yytext); return NUMBER; }
{identifier} { strcpy(yylval.s, yytext); return IDENTIFIER; }
\"(.)+\" { strcpy(yylval.s, yytext); return STRING_CONSTANT; }
\'.\' { yylval.s[0] = *yytext; yylval.s[1] = '\0'; return CHARACTER; }
"#" { ignoreHeadfile(); linesno++; }
\n { linesno++; }
. { /*other characters*/ }
%%
void comment(void)
{
char c ,prev = NULL;
while ((c = input()) != 0)
{
if ( c == '\n')
linesno++;
if (prev == '*' && c == '/')
return;
prev = c;
}
error("unterminated comment");
}
void ignoreHeadfile()
{
while(input() != '\n');
return;
}