Section :PISI2/ LSI2.
Matière : Compilation.
Enseignante cours : Mme Hager KAMMOUN BOUZAIENE.
Année Universitaire : 2022/2023.
TD 2 Analyse Syntaxique
Exercice 1
On s'intéresse à décrire les différentes étapes de la compilation pour le petit programme suivant :
program calcul;
var
T : array[1..10] of integer;
S,I : integer;
begin
S:=0; (* initialisation *)
for I:= 1 to 10 do
begin
read(T[I]);
S := S + T[I]
end;
writeln(S)
end.
Dans ce but, il est demandé de :
1. Fournir la liste des entités lexicales.
2. Proposer une grammaire permettant d'engendrer le langage auquel ce programme
appartient.
3. Donner l'arbre de dérivation syntaxique associé à ce programme pour la grammaire
précédente.
Exercice 2
En C ou en Java, la structure de contrôle switch permet d'effectuer un branchement à choix
multiples. La syntaxe d'une instruction switch est :
switch (expr) {opt-label-instr-list}
où expr est une expression valide et le corps opt-label-instr-list du switch est une suite d'instructions
chacune pouvant être préfixée par un label de choix. Un label de choix est soit default soit un ou
plusieurs labels de la forme case cste : avec cste une constante du langage.
Un exemple de programme, utilisant cette instruction, est donné ci-dessous :
#define EOF -1
main()
{ int c, nwhite, nother;
nwhite = nother = 0;
while ((c=getchar()) != EOF)
switch (c) {
case ' ':
case '\n':
case '\t':
nwhite++; break;
default:
1
nother++; break;
}
printf("white space = %d, other = %d\n",nwhite,nother);
}
1. On suppose que la grammaire du langage est partiellement écrite avec des non-terminaux
cste, expr et instr qui reconnaissent respectivement les expressions constantes, les expressions
du langage, et les instructions et qui comportent au moins les règles :
expr ident cste 'char'
expr cste instr break ;
expr ident++ instr expr ;
avec char et ident des terminaux correspondant aux unités lexicales des caractères et des
identificateurs.
Compléter la grammaire pour accepter les instructions switch.
2. Donner l'arbre de dérivation syntaxique de l'instruction :
switch (c) {
case ' ':
case '\n':
case '\t':
nwhite++; break;
default:
nother++; break;
}