-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexico.l
171 lines (134 loc) · 4.02 KB
/
lexico.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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
%{
#include <string.h> /* for strdup */
#include "global.h"
#include "sintatico.tab.h"
%}
%option noyywrap nodefault yylineno
/* DEFINITIONS */
word [a-zA-Z_0-9][a-zA-Z_0-9]*
text {word}(" "{word})+
slash \/
one_line_comment {slash}{slash}[ ]*{word}+{text}*
open_brace \{
close_brace \}
asterisk \*
brace_asterisk_comment {open_brace}{asterisk}*[ ]*{word}+[ ]*\n*[ ]*\t*[ ]*{text}*[ ]*{asterisk}*[ ]*{close_brace}[ ]*
withespace [ \r\t\n]+
digits [0-9]+
real {digits}("."{digits})
apostrophe "\'"
quotation_marks "\""
some_char .
%% /* RULES */
{withespace} /* Ignore */ ;
"program" {return T_PROGRAM;}
"begin" {return T_BEGIN_STATEMENT;}
"end." {return T_END_PROGRAM;}
"end" {return T_END_STATEMENT;}
":=" {return T_ATTRIBUTION;}
";" {return T_SEMICOLON;}
":" {return T_COLON;}
"=" {return T_EQUAL;}
"<>" {return T_DIFFERENT;}
">" {return T_BIGGER;}
">=" {return T_BIGGER_OR_EQUAL;}
"<" {return T_MINOR;}
"<=" {return T_MINOR_OR_EQUAL;}
"(" {return T_LEFT_PARENTHESIS;}
")" {return T_RIGHT_PARENTHESIS;}
"uses" {return T_USES_STATEMENT;}
"var" {return T_VAR_STATEMENT;}
"if" {return T_IF_STATEMENT;}
"else" {return T_ELSE_STATEMENT;}
"then" {return T_IF_THEN_STATEMENT;}
"while" {return T_WHILE_STATEMENT;}
"do" {return T_DO_STATEMENT;}
"const" {return T_CONST_STATEMENT;}
"and" {return T_AND_STATEMENT;}
"or" {return T_OR_STATEMENT;}
"for" return(T_FOR_STATEMENT);
"to" return(T_TO_STATEMENT);
"downto" return(T_DOWNTO_STATEMENT);
"repeat" return(T_REPEAT_STATEMENT);
"until" return(T_UNTIL_STATEMENT);
"write" {return T_WRITE;}
"writeln" {return T_WRITELN;}
"read" {return T_READ;}
"readln" {return T_READLN;}
"string" {return T_TYPE_STRING;}
"char" {return T_TYPE_CHAR;}
"boolean" {return T_TYPE_BOOLEAN;}
"byte" {return T_TYPE_BYTE;}
"integer" {return T_TYPE_INTEGER;}
"shortint" {return T_TYPE_SHORTINT;}
"smallint" {return T_TYPE_SMALLINT;}
"word" {return T_TYPE_WORD;}
"cardinal" {return T_TYPE_CARDINAL;}
"longint" {return T_TYPE_LONGINT;}
"longword" {return T_TYPE_LONGWORD;}
"int64" {return T_TYPE_INT64;}
"qword" {return T_TYPE_QWORD;}
"real" {return T_TYPE_REAL;}
"double" {return T_TYPE_DOUBLE;}
"single" {return T_TYPE_SINGLE;}
"comp" {return T_TYPE_COMP;}
"currency" {return T_TYPE_CURRENCY;}
"extended" {return T_TYPE_EXTENDED;}
"+" {return T_OPERATOR_PLUS;}
"-" {return T_OPERATOR_MINUS;}
"mod" {return T_OPERATOR_MOD;}
"div" {return T_OPERADOR_DIV;}
{slash} {return T_SLASH;}
{asterisk} {return T_ASTERISK;}
"clrscr" {return T_CLRSCR;}
{apostrophe} {return T_APOSTROPHE;}
{quotation_marks} {return T_QUOTATION_MARKS;}
{digits} {
yylval.all = (type_values*) malloc(sizeof(type_values));
yylval.all->type = TYPE_INT;
int * value = malloc(sizeof(int));
* value = atoi(yytext);
yylval.all->value = (int*) value;
return T_INT_NUMBER;
}
{real} {
yylval.all = (type_values*) malloc(sizeof(type_values));
yylval.all->type = TYPE_DOUBLE;
double * value = malloc(sizeof(double));
* value = atof(yytext);
yylval.all->value = (double*) value;
return T_DOUBLE_NUMBER;
}
{one_line_comment} {
yylval.all = (type_values*) malloc(sizeof(type_values));
yylval.all->type = TYPE_STRING;
yylval.all->value = malloc(sizeof(strlen(yytext)));
strcpy(yylval.all->value, yytext);
return T_SLASH_COMMENT;
}
{brace_asterisk_comment} {
yylval.all = (type_values*) malloc(sizeof(type_values));
yylval.all->type = TYPE_STRING;
yytext = yytext + 1;
yylval.all->value = malloc(sizeof(strlen(yytext) - 1));
strncpy(yylval.all->value, yytext, strlen(yytext) - 1);
return T_BRACE_COMMENT;
}
{apostrophe}{text}{apostrophe} {
yylval.all = (type_values*) malloc(sizeof(type_values));
yylval.all->type = TYPE_STRING;
yytext = yytext + 1;
yylval.all->value = malloc(sizeof(strlen(yytext) - 1));
strncpy(yylval.all->value, yytext, strlen(yytext) - 1);
return T_SOME_TEXT;
}
{word} {
yylval.all = (type_values*) malloc(sizeof(type_values));
yylval.all->type = TYPE_STRING;
yylval.all->value = malloc(sizeof(strlen(yytext)));
strcpy(yylval.all->value, yytext);
return T_SOME_WORD;
}
{some_char} {
printf("%s:%d: Mystery character '%s'\n", curfilename, yylineno, yytext);
}