Analyse sémantique

   

 

    Généralités

    Tables de compilation

Tabob                    : table des objets

Tabcomp          : table complémentaires

Quadruple     : table des quadruplets

Tabtyp                 : table des types

Validf                     : table des identificateurs

Tabidf                   : table des indices vers les objets

    Les variables temporaires (ou auxiliaires)

      Element, Entete, Struct, Valeur, Suivant

    Attribution des adresses aux objets

    Organisation de la zone de données

Mot 0   : Adresse zone de données de l'appelant

Mot 1   : Adresse vers un entier contenant le numéro de l'appelant

Mot 2   : Adresse vers un entier contenant le numéro du quadruplé de retour dans l'appelant ( adresse de retour)

Mot 3, Mot 4, .....Mot i : Paramètres

Mot i+1, Mot i+2, ... : Variables locaux et temporaires

      Sémantique des modules

    Compilation d'un module

Pt1 : Nombre de paramètres

Pt2 : Adresse dans Tabcomp où l'on trouve la liste des paramètres formels.

Pt3 : Adresse dans Tabpro

    Appel de procédure (ou fonction)

Pt1 : Adresse dans Tabconscar vers le nom du module appelé

Pt2 : Adresse dans Tabcomp où l'on trouve la liste des paramètres réels

Pt3 : Nombre de paramètres

    Retour de procédure (ou fonction)

    Fonction utilisateur dans une expression

      Fragment de l'analyseur Sémantique

 

  Voici un fragment de la procédure de l'analyseur syntaxico- sémantique correspondant aux instructions :

 

      PROCEDURE Fonction;

        VAR

          Sauvp2, Fonct, Idf : STRING;

          Sauvivar, Sauvtemp : BYTE;

          Bsauvivar, Bsauvtemp : BOOLEAN;

          Sauvpteurtabcomp : BYTE;

          Nbrind : BYTE;

 

        LABEL  Et1, Et2, Et3, Et4, Et5, Fin ;

 

        {---------------------------------------------------}

        {  F O N C T I O N S     S E M A N T I Q U E S      }

        {---------------------------------------------------}

 

        PROCEDURE F1 ;

          BEGIN

            Fonct := Semprec;

          END;

 

        {-----------------------------------------------------------------------}

        PROCEDURE F2;

          BEGIN

            Idf := Semprec

          END;

 

        {-----------------------------------------------------------------------}

        PROCEDURE F3;

          VAR

            P1: CHAR;

            P2:  Type255;

            Pp3,P4,P5 : BYTE ;

            Bpt : BOOLEAN;

          BEGIN

            Old_ident (Idf,Ivar, Bpt);

            IF Ivar = 0

            THEN P3(3)

            ELSE

              BEGIN

                Old_attribut(Ivar,Bpt, P1,P2,Pp3,P4,P5);

                IF Fonct = 'NBRNOMBRE'

                THEN

                  IF (P2 <> 'MN')

                  THEN

                    P3(10)

                  ELSE

                    BEGIN

                      Genertemp(Temp,'X','E') ;

                      Btemp := TRUE;

                      Enterquad(Sauvnumligne,'Nbrnombre',Ivar,0,Temp, Bpt, TRUE, Btemp);

                    END;

 

                IF Fonct = 'NBRCAR'

                THEN

                  IF (P2 <> 'MC')

                  THEN

                    P3(11)

                  ELSE

                    BEGIN

                      Genertemp(Temp,'X','E') ;

                      Btemp := TRUE;

                      Enterquad(Sauvnumligne,'Nbrcar',Ivar,0,Temp, Bpt, TRUE, Btemp );

                    END;

 

                IF Fonct = 'FINFICH'

                THEN

                  IF (P2[1] <> 'F')

                  THEN

                    P3(41)

                  ELSE

                    BEGIN

                      Genertemp(Temp,'X','B') ;

                      Btemp := TRUE;

                      Enterquad(Sauvnumligne,'Finfich',Ivar,0,Temp, Bpt, TRUE, Btemp );

                    END;

 

                IF Fonct = 'ALLOC_BLOC'

                THEN

                  IF (P2[1] <> 'F')

                  THEN

                    P3(41)

                  ELSE

                    BEGIN

                      Genertemp(Temp,'X','E') ;

                      Btemp := TRUE;

                      Enterquad(Sauvnumligne,'Alloc_bloc',Ivar,0,Temp, Bpt, TRUE, Btemp );

                    END;

 

              END;

          END;

 

          ...

          ...

 

        BEGIN

          IF Syn = 1 THEN GOTO Et1 ;{ Idf Sauf Premier Appel à Fonction }

          IF Syn = 29 THEN GOTO Et2;  { Nbrcar, Nbrnombre, finfich, Alloc_bloc }

          IF Syn = 33  THEN GOTO Et3;  { Element    }

          IF Syn = 34  THEN GOTO Et4;  { Struct, Entete }

          IF Syn = 27 THEN GOTO Et5;   { Valeur, Suivant }

 

          Et1 : { Idf }

            Check(1, 0);

            Ff2;

            GOTO Fin;

 

          Et2 : { Nbrcar, Nbrnombre, finfich }

            Check(29, 0);

            F1;

            Check(7, 1);

            Check(1, 7);

            F2;

            Check(8, 3);

            F3;

            GOTO Fin;

 

          Et3 : { Element }

            Check(33, 0);

            F1;

            Check(7, 1);

            Fonction ;

            Check(37, 17);

            Ff4;

            Expr;

            Ff5(TRUE);

            WHILE Syn = 9 DO

              BEGIN

                Check(9, 0);

                Expr;

                Ff5(FALSE);

              END;

            Check (38, 18);

            Check(8, 3);

            F6;

            GOTO Fin;

 

          Et4 :  { Struct, Entete, Caract }

            Check(34, 0);

            F1;

            Check(7, 1);

            Expr;

            Ff3;

 

            Check(9, 6);

            Expr;

            F7;

            Check(8, 3);

            GOTO Fin;

 

          Et5 : { Suivant, Valeur , Aleachaine, Aleanombre, Longchaine}

            Check (27, 0);

            F1;

            Check(7, 1);

            Expr ;

            Check(8, 3);

            F4;

            GOTO Fin;

 

          Fin :

        END;