-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcm.l
More file actions
98 lines (83 loc) · 1.64 KB
/
cm.l
File metadata and controls
98 lines (83 loc) · 1.64 KB
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
%{
#include "globals.h"
#include "util.h"
#include "scan.h"
char tokenString[MAXTOKENLEN+1];
char oldTokenString[MAXTOKENLEN+1];
%}
digit [0-9]
number {digit}+
letter [a-zA-Z]
identifier {letter}+
newline \n
whitespace [ \t]+
%%
"if" {return IF;}
"else" {return ELSE;}
"int" {return INT;}
"return" {return RETURN;}
"void" {return VOID;}
"while" {return WHILE;}
"==" {return EQ;}
"!=" {return NE;}
"<=" {return LE;}
"<" {return LT;}
">=" {return GE;}
">" {return GT;}
"/*" {
register int c;
int start_lineno = lineno;
while ( 1 ){
while ((c = input()) != '*' && c != EOF){
if (c == '\n')
lineno++;
}
if (c == '*'){
c = input();
if (c == '/')
break;
unput(c);
}
if (c == EOF){
fprintf(listing, "\t%d\t\tERROR\t\t/*\n", start_lineno);
return CMERROR;
}
}
}
"+" {return PLUS;}
"-" {return MINUS;}
"*" {return TIMES;}
"/" {return OVER;}
"=" {return ASSIGN;}
";" {return SEMICOLON;}
"," {return COLON;}
"(" {return LPAREN;}
")" {return RPAREN;}
"[" {return LSQBRKT;}
"]" {return RSQBRKT;}
"{" {return LBRACE;}
"}" {return RBRACE;}
{number} {return NUM;}
{identifier} {return ID;}
{newline} {lineno++;}
{whitespace} {/*skip*/}
. return ERROR;
%%
TokenType getToken(void){
static int firstTime = TRUE;
TokenType currentToken;
if (firstTime){
firstTime = FALSE;
lineno++;
yyin = source;
yyout = listing;
}
else strncpy(oldTokenString, tokenString, MAXTOKENLEN);
currentToken = yylex();
strncpy(tokenString, yytext, MAXTOKENLEN);
if (NO_PARSE){
fprintf(listing, "\t%d\t\t", lineno);
printToken(currentToken, tokenString);
}
return currentToken;
}