Analyse syntaxique
Derrière tout langage de programmation il ya une grammaire formée de l'ensemble des règles utilisées pour l'écriture des programmes.
L'analyseur syntaxique a pour rôle de vérifier la syntaxe des programmes. Il vérifie si les unités lexicales produites (Syn) par le scanner sont bien agencées, c'est à dire conformes aux règles de grammaire. Il s'agit donc d'une analyse macroscopique.
Comme notre grammaire est LL(1), l'analyseur est écrit sous forme de "Descente récursive", c'est à dire à chaque règle, on associe une procédure.
Fragment de l'analyseur syntaxique
Voici un fragment de la procédure de l'analyseur syntaxique
correspondant aux instructions :
BEGIN
IF Syn =1 THEN GOTO Et1; { Identificateur }
IF Syn = 15 THEN GOTO Et2; { Tantque }
IF Syn = 17 THEN GOTO Et3; { Si }
IF Syn = 26 THEN GOTO Et4; { Allouer, liberer, fermer }
IF Syn = 20 THEN GOTO Et5; { Lire }
IF Syn = 19 THEN GOTO Et6; { Ecriture }
IF Syn = 35 THEN GOTO Et7; { Creer_mcar }
IF Syn = 31 THEN GOTO Et8; { Aff_element }
IF Syn = 39 THEN GOTO Et9; { Creer_liste, Init_vect, Init_struct}
IF Syn = 47 THEN GOTO Et10; { Pour }
IF Syn = 50 THEN GOTO Et11; { Aff_adr, Aff_val }
IF Syn = 51 THEN GOTO Et12; { Appel }
IF Syn = 28 THEN GOTO Et13; { Lirecar, Lirenombre, lireseq, ecrireseq, rajouter}
IF Syn = 30 THEN GOTO Et14; { Aff_struct, Aff_entete, Liredir, Ecriredir }
IF Syn = 56 THEN GOTO Et15; { Ouvrir }
Et1: Check (1, 0); { Affectation }
IF Syn <> 13
THEN P2(8)
ELSE
BEGIN
Check (13, 0);
Expr;
END;
GOTO Fin;
Et2: Check(15, 0); { Tantque }
Expr;
IF Syn = 10 THEN Check(10, 0); { ':' Facultatif }
Lis;
Check (16, 4);
GOTO Fin;
Et3 : Check(17, 0); { Si }
Expr;
IF Syn = 10 THEN Check(10, 0);
Lis;
IF Syn = 21
THEN
BEGIN
Check(21, 0);
Lis;
END;
Check(24, 5);
GOTO Fin;
Et4 : Check(26, 0); { Liberer, Allouer, fermer }
Check(7, 1);
Expr;
Check(8, 3);
GOTO Fin;
Et5 :
Check(20, 0) ; { Lire }
Check(7, 1);
Check(1, 7);
WHILE Syn = 9 DO
BEGIN
Check(9, 0);
Check(1, 0);
END;
Check(8, 3);
GOTO Fin;
Et6 :
Check(19, 0) ; { Ecrire }
Check(7, 1);
Expr;
WHILE Syn = 9 DO
BEGIN
Check(9, 0);
Expr;
END;
Check(8, 3);
GOTO Fin;
Et7 :
Check(35, 0); { Creer_mcar }
Check(7, 1);
Check(1, 7);
Check(9, 6);
Check(37, 17);
Check(25, 13);
Check (38, 18);
Check(8, 3);
GOTO Fin;
Et8 :
Check(31, 0); { Aff_element ( Exp [ Listexp ], Exp ) }
Check(7, 1);
Expr;
Check(37, 17);
Expr;
WHILE Syn = 9 DO
BEGIN
Check(9, 0);
Expr;
END;
Check (38, 18);
Check(9, 6);
Expr;
Check(8, 3);
GOTO Fin;
Et9 .....
Fin :
END
END;