-
Notifications
You must be signed in to change notification settings - Fork 0
/
pascal.l
157 lines (141 loc) · 4.08 KB
/
pascal.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
/* Définitions */
%{
/* Code C */
int outputLexical = 1; // flag qui permet d'afficher(1)/masquer(0) les messages de l'analyseur lexicale, par défaut (1)
/* fonction qui affiche un message passé en paramétre */
void output(const char* msg) {
if(outputLexical == 1) {
printf("Analyseur lexicale: %s\n", msg);
}
}
/* chaine de caractéres utilisé avec la fonction output() */
char buffer[50];
#include "pascal.tab.h"
%}
%option yylineno
lettre [a-zA-Z]
chiffre [0-9]
id {lettre}({lettre}|{chiffre})*
nb {chiffre}+
blanc [ \t\n]+
chaine \'[^\']*\'
commentaire "{"[^{}]*"}"
%%
/* Définitions et expressions régulières */
/*
lexèmes à reconnaître:
mots clés:
begin
do
else
end
function
if
int
procedure
program
then
var
while
*/
[bB][eE][gG][iI][nN] { output("mot cle: BEGIN"); return BEGIN_TOKEN; }
[dD][oO] { output("mot cle: DO"); return DO; }
[eE][lL][sS][eE] { output("mot cle: ELSE"); return ELSE; }
[eE][nN][dD] { output("mot cle: END"); return END; }
[fF][uU][nN][cC][tT][iI][oO][nN] { output("mot cle: FUNCTION"); return FUNCTION; }
[iI][fF] { output("mot cle: IF"); return IF; }
[iI][nN][tT] { output("mot cle: INT"); return INT; }
[pP][rR][oO][cC][eE][dD][uU][rR][eE] { output("mot cle: PROCEDURE"); return PROCEDURE; }
[pP][rR][oO][gG][rR][aA][mM] { output("mot cle: PROGRAM"); return PROGRAM; }
[tT][hH][eE][nN] { output("mot cle: THEN"); return THEN; }
[vV][aA][rR] { output("mot cle: VAR"); return VAR; }
[wW][hH][iI][lL][eE] { output("mot cle: WHILE"); return WHILE; }
/*
nb (nombres: chiffre chiffre*)
*/
{nb} {
sprintf(buffer, "NB: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return NB;
}
[nN][oO][tT] {
sprintf(buffer, "OPREL/NOT: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return NOT;
}
/*
id (identificateurs)
*/
{id} {
sprintf(buffer, "ID: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return ID;
}
/*
oprel (opérateurs relationnels: == <> < > <= >=)
*/
==|<>|<|>|<=|>= {
sprintf(buffer, "OPREL: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return OPREL;
}
/*
opadd (+ - or)
*/
\+|-|[oO][rR] {
sprintf(buffer, "OPADD: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return OPADD;
}
/*
opaffect (=)
*/
= {
sprintf(buffer, "OPAFFECT: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return OPAFFECT;
}
/*
opmul (* / div mod and)
*/
\*|\/|[dD][iI][vV]|[mM][oO][dD]|[aA][nN][dD] {
sprintf(buffer, "OPMUL: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return OPMUL;
}
/*
* chaine de caractéres
*/
{chaine} {
sprintf(buffer, "CHAINE: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
return CHAINE;
}
/*
* caractéres blancs: espace, tabulation, retour chariot
*/
{blanc} {
/* les caractéres blancs sont à ignorer, on ne retourne rien */
}
/*
* commentaires: placés entre { ... }
*/
{commentaire} {
sprintf(buffer, "COMMENTAIRE: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
/* les commentaires sont à ignorer aussi */
}
/*
Les caractéres restants
*/
. {
sprintf(buffer, "AUTRE: %s (%d caractere(s))", yytext, yyleng);
output(buffer);
/* dans le cas des autres caractéres, on doit le retourner tel qu'il est */
return *yytext; /* ou alors, return yytext[0] */
}
%%
/* Code C */
int yywrap(void) {
return 1;
}