-
Notifications
You must be signed in to change notification settings - Fork 1
/
a1.flex
144 lines (137 loc) · 2.68 KB
/
a1.flex
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
%{
/* Chandler Bullock
Akal
CPSC411 Assignment #1
*/
#include <stdio.h>
FILE *output;
int lineNumber = 1;
int commentOpen = 0;
enum TokenType{
NUM,ID,KEYWORD,ERROR,END,SYMBOL, NEWLINE
}token;
%}
WSPACE [ \t]+
BOOL bool
INT int
ELSE else
NOT not
RET return
TRUE true
FALSE false
VOID void
WHILE while
PLUS \+
MINUS -
STAR \*
SLASH \/
LT <
GT >
LTE <=
GTE >=
EQ ==
NOTEQ !=
ASSIGN =
AND &&
OR "||"
SEMI ;
COMMA ,
OPENP \(
CLOSEP \)
OPENB \[
CLOSEB \]
OPENBRACE \{
CLOSEBRACE \}
OPENCOMM "/*"
CLOSECOMM "*/"
DIGIT [0-9]
NUM {DIGIT}+
LETTER [A-Z]|[a-z]
ID {LETTER}+
NEWLINE "\n"
UNIDENTIFIED .
%%
{BOOL} {return KEYWORD;}
{INT} {return KEYWORD;}
{ELSE} {return KEYWORD;}
{NOT} {return KEYWORD;}
{RET} {return KEYWORD;}
{TRUE} {return KEYWORD;}
{FALSE} {return KEYWORD;}
{VOID} {return KEYWORD;}
{WHILE} {return KEYWORD;}
{PLUS} {return SYMBOL;}
{MINUS} {return SYMBOL;}
{STAR} {return SYMBOL;}
{SLASH} {return SYMBOL;}
{LT} {return SYMBOL;}
{GT} {return SYMBOL;}
{LTE} {return SYMBOL;}
{GTE} {return SYMBOL;}
{EQ} {return SYMBOL;}
{NOTEQ} {return SYMBOL;}
{ASSIGN} {return SYMBOL;}
{AND} {return SYMBOL;}
{OR} {return SYMBOL;}
{SEMI} {return SYMBOL;}
{COMMA} {return SYMBOL;}
{OPENP} {return SYMBOL;}
{CLOSEP} {return SYMBOL;}
{OPENB} {return SYMBOL;}
{CLOSEB} {return SYMBOL;}
{OPENBRACE} {return SYMBOL;}
{CLOSEBRACE} {return SYMBOL;}
{NUM} {return NUM;}
{ID} {return ID;}
{WSPACE} {/*do nothing*/}
{NEWLINE} {lineNumber++;}
{OPENCOMM} {commentOpen = 1;}
{CLOSECOMM} {if (commentOpen == 1){commentOpen = 0;} else {fprintf(output,"%d: Unmatched */\n", lineNumber);}}
{UNIDENTIFIED} {return ERROR;}
<<EOF>> {return END;}
%%
void printToken(enum TokenType token){
/*get a string for what will print after line number and before the lexeme*/
char* text;
switch(token){
case NUM:
text = " NUM: ";
break;
case ID:
text = " ID, name = ";
break;
case KEYWORD:
text = " reserved word: ";
break;
case SYMBOL:
text = " special symbol: ";
break;
case ERROR:
text = " ERROR: ";
break;
default:
text = " Something went wrong, unclassified token";
}
fprintf(output, "%d:%s%s\n", lineNumber, text, yytext);
}
int main(int argc, char** argv){
output = fopen("out.txt", "w");
FILE *readFrom;
if (argc == 2){
readFrom = fopen(argv[1],"r");
fprintf(output, "C- COMPILATION: %s\n", argv[1]);
} else{
readFrom = fopen("input.cm", "r");
fprintf(output, "C- COMPILATION: input.cm\n");
}
yyin = readFrom;
token = yylex();
while (token != END){
if (token != NEWLINE && commentOpen != 1) {printToken(token);}
token = yylex();
}
if (commentOpen == 1){fprintf(output, "%d: ERROR: EOF in comment", lineNumber);}
fclose(output);
fclose(readFrom);
return 0;
}