-
Notifications
You must be signed in to change notification settings - Fork 1
/
X0lex.l
135 lines (120 loc) · 2.49 KB
/
X0lex.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
125
126
127
128
129
130
131
132
133
134
135
%{
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"
#include "X0Compiler.v1.tab.h"
void comment();
int line=1;
void yyerror(char *);
int yywrap(void);
%}
%%
"/*" {comment();}
[ \t] {;}
[\n] {line++;}
"bool" {return BOOLSYM;}
"break" {return BREAKSYM;}
"case" {return CASESYM;}
"char" {return CHARSYM;}
"const" {return CONSTSYM;}
"continue" {return CONTINUESYM;}
"do" {return DOSYM;}
"default" {return DEFAULTSYM;}
"else" {return ELSESYM;}
"for" {return FORSYM;}
"if" {return IFSYM;}
"int" {return INTSYM;}
"main" {return MAINSYM;}
"read" {return READSYM;}
"repeat" {return REPEATSYM;}
"switch" {return SWITCHSYM;}
"string" {return STRINGSYM;}
"then" {return THENSYM;}
"unsigned" {return UNSIGNEDSYM;}
"until" {return UNTILSYM;}
"while" {return WHILESYM;}
"write" {return WRITESYM;}
"return" {return RETURNSYM;}
"true" {
yylval.boolean = 1;
return BOOL;
}
"false" {
yylval.boolean = 0;
return BOOL;
}
[A-Za-z_]([A-Za-z]|[0-9]|_)* {
yylval.ident=(char *)malloc(strlen(yytext)+1);
strcpy(yylval.ident,yytext);
return IDENT;
}
[+|-]?[0-9]+ {
yylval.number=atoi(yytext);
return NUMBER;
}
["].*["] {
yylval.string_chars = (char*)malloc(strlen(yytext) - 1);
int i, j = 0;
for (i = 1; i < strlen(yytext) - 1; ++i) {
yylval.string_chars[j++] = yytext[i];
}
yylval.string_chars[strlen(yytext) - 1] = '\0';
return STRING;
}
['].['] {
yylval.single_char = yytext[1];
return CHAR;
}
":=" {return BECOMES;}
"<" {return LSS;}
"<=" {return LEQ;}
">" {return GTR;}
">=" {return GEQ;}
"==" {return EQL;}
"!=" {return NEQ;}
"+" {return PLUS;}
"++" {return INC;}
"-" {return MINUS;}
"--" {return DEC;}
"*" {return TIMES;}
"/" {return SLASH;}
"%" {return MOD;}
"(" {return LPAREN;}
")" {return RPAREN;}
"[" {return LBRACK;}
"]" {return RBRACK;}
"{" {return LBPAREN;}
"}" {return RBPAREN;}
"&&" {return AND;}
"||" {return OR;}
"!" {return NOT;}
"^^" {return XOR;}
"," {return COMMA;}
"." {return PERIOD;}
":" {return COLON;}
";" {return SEMICOLON;}
. {yyerror("Unknown character!");}
%%
void redirectInput(FILE *input) {
yyin=input;
}
int yygetchar(void) {
int ret;
ret = getc(yyin);
printf("%c",ret);
return ret;
}
int yywrap(void) {
return 1;
}
void comment() {
line = 0;
char c, prev = 0;
while (c = getchar()) {
if (c == '/' && prev == '*')
return;
prev = c;
}
printf("unterminated comment");
}