-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexical.l
119 lines (94 loc) · 2.33 KB
/
lexical.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
%{
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include "parse.tab.h"
#include "line.h"
int lines;
void despace(char target[], char input[], int l);
void print_error();
int y=1;
%}
sp [ \t]*
id [a-zA-Z][a-zA-Z0-9_]*
pnum ([0-9]+)|([0-9]+)"."([0-9]+)
nnum "-"{pnum}
num {nnum}|{pnum}
%%
{sp}"int"{sp} {y=1;return INT;}
{sp}"float"{sp} {y=1;return FLT;}
{sp}"void"{sp} {y=1;return VOID;}
{sp}"printf"{sp} {y=1;return PRINT;}
{sp}"$$"{sp} {y=1;return DOL;}
{sp}"if"{sp} {y=1;return IF;}
{sp}"else"{sp} {y=1;return ELSE;}
{sp}"for"{sp} {y=1;return FORT;}
{sp}"while"{sp} {y=1;return WHILET;}
{sp}"return"{sp} {y=1;return RET;}
{sp}"switch"{sp} {y=1;return SWITCHT;}
{sp}"break"{sp} {y=1;return BREAK;}
{sp}"default"{sp} {y=1;return DEFAULT;}
{sp}"case"{sp} {y=1;return CASET;}
{sp}{id}{sp} {y=0;char input[1000]; despace(input,yytext,strlen(yytext));strcpy(yylval.vp.vali,input);return ID;}
{sp}{num}{sp} {
char input[1000];
despace(input,yytext,strlen(yytext));
if(y==0)
{
if(input[0]=='-')
{
for(int i=strlen(input)-1;i>=1;i--)
unput(input[i]);
y=1;
return MINUS;
}
}
y=0;
strcpy(yylval.vp.vali,input);
return NUM;
}
{sp}";"{sp} {y=1;return SC;}
{sp}":"{sp} {y=1;return COLON;}
{sp}","{sp} {y=1;return COMMA;}
{sp}"="{sp} {y=1;return EQ;}
{sp}"||"{sp} {y=1;return OR;}
{sp}"&&"{sp} {y=1;return AND;}
{sp}"!"{sp} {y=1;return NOT;}
{sp}"<"{sp} {y=1;return LT;}
{sp}"<="{sp} {y=1;return LTE;}
{sp}">"{sp} {y=1;return GT;}
{sp}">="{sp} {y=1;return GTE;}
{sp}"=="{sp} {y=1;return EQEQ;}
{sp}"!="{sp} {y=1;return NEQ;}
{sp}"+"{sp} {y=1;return PLUS;}
{sp}"-"{sp} {y=1;return MINUS;}
{sp}"*"{sp} {y=1;return MULT;}
{sp}"/"{sp} {y=1;return DIV;}
{sp}"%"{sp} {y=1;return MOD;}
{sp}"("{sp} {y=1;return OPT;}
{sp}")"{sp} {y=0;return CPT;}
{sp}"{"{sp} {y=1;return OCURLY;}
{sp}"}"{sp} {y=1;return CCURLY;}
{sp}"["{sp} {y=1;return OSQ;}
{sp}"]"{sp} {y=1;return CSQ;}
\n {lines++;}
. {}
%%
int yywrap(void) {
return 1;
}
void despace(char target[], char input[], int l){
int start=0, end=l-1;
while(input[start]==' ' || input[start]=='\t') start++;
while(input[end]==' ' || input[end]=='\t') end--;
int y=0;
for (int i = start; i <= end; ++i)
{
target[y++]=input[i];
}
target[y]='\0';
}
void print_error()
{
printf("Invalid Syntax while lexical analysis.\n");
}