next up previous Project Oscar

Up: Exemple d'utilisation du système

Previous: Ecriture des grammaires attribuées

Appel des grammaires attribuées

La description du compilateur SIMPROC est terminée, il nous reste à écrire l'appel des grammaires attribuées et de la spécification PPAT, dans le fichier simproc_smp.c, produit par simproc.mkfnc.

#include "simproc.h"	/* Pour inclure éventuellement nos applications	*/

/* La passe sémantique et l'appel du décompilateur d'arbre */
/* ======================================================= */
static VOID simprocsmp ()

{
    /* Pointeurs sur les résultats de nos grammaires attribuées */
    /* ======================================================== */
    struct simproc__check_result *r;  
    struct simproc__term_result *r1;
    
    FILE *sortie, *arbre;
    char lst_name [132];

    /* Cette fonction est definie dans simproc.c
       elle est produite avec  mkfnc2 avec le fichier simproc.mkfnc2 */
    /* ============================================================= */
    init___simproc ();	
    

    /* C'est ici que prend place l'appel de nos grammaires attribuées dans */
    /* ====================================================================*/

    /* 1) La grammaire attribuée procédurale de sémantique statique  */
    /*    - simproc__check est le nom de notre premiere grammaire attribue */
    /*      (simproc-check.olga) */
    /*    - f2atcvar.atc_lv.abstract_tree_root est la racine de l'arbre */
    /*      abstrait issu de l'analyse lexico-syntaxique (SYNTAX) */
    r = simproc__check (f2atcvar.atc_lv.abstract_tree_root);

    /* 2) Si la passe sémantique est correcte, on construit l'arbre abstrait */
    /*    pour la génération du code cible. */
    /*    Dans cette phase, la grammaire attribuée fonctionnelle  */
    /*    simproc-check.olga, est utilisée pour construire l'arbre abstrait */
    /*    décrit par la syntaxe attribuée abstraite simproc-adt.asx. */
    /*    Finalement, on appelle le décompilateur ppat crée a partir de la */
    /*    spécification simproc-ppat.ppat. r1->Program est la racine de */
    /*    l'arbre. La chaîne vide "" indique que la décompilation se fera  */
    /*    sur la sortie standard. Une chaîne non-vide indiquerait un nom de  */
    /*    fichier pour contenir le résultat de le décompilation. 80 indique  */
    /*    la longueur maximale des lignes avant application des règles de  */
    /*    césure (voir la documentation de ppat) */
    if (r -> correct) {
	r1 = simproc__term (f2atcvar.atc_lv.abstract_tree_root);
	ppat___simproc__ppat(r1->Program,80,"");
    }
}

/* Dans le cas de l'exemple simproc, le code ci-dessous n'a pas */
/* a etre modifie par l'utilisateur */
/* ============================================================ */

static VOID simprocfinal ()
{
    FILE	*sortie;
    char	lst_name [132];

}

static simprocopen (tables)
    register struct sxtables *tables;
{
    f2atcvar.atc_lv.node_size = sizeof (NODE) /* size of the olga_node */;
}

VOID simproc_smp (entry,arg)
int  entry;
struct sxtables *arg;
{

    switch (entry) {
    case OPEN:
	simprocopen (arg);
	break;

    case CLOSE:
	break;

    case ACTION:
    case SEMPASS:
	simprocsmp ();
	break;

    case INIT:
	break;

    case FINAL:
	simprocfinal ();
	break;

    default:
	fprintf (sxstderr, "The function \"simprocsmp\"
                 is out of date with respect to its specification.\n");
	break;
    }
    return;
    /* end simprocsmp */
}

Enfin, nous pouvons réaliser l'étape finale avec le script FNC2. Nous choisirons l'option F inal, ce qui aura pour effet de compiler l'ensemble des fichiers CC produits par SYNTAX/FNC-2.

Le résultat de la compilation (le compilateur SIMPROC), se trouve dans le répertoire $HOME/simproc/bin/solaris/simproc (dans le cas d'une utilisation sous machine SOLARIS).

Il ne reste plus qu'à utiliser le compilateur en lui soumettant un programme de test, comme celui-ci par exemple :

	    integer J;
	
	    proc factorial (val I , var F )
		begin
		integer TEMP;
		if I eq 0 then F := 1
			  else 	call factorial(I-1, TEMP);
				F := TEMP * I
		fi	
	    end;
	
	    call factorial (5, J)

En appelant notre compilateur SIMPROC avec comme paramètre le nom d'un fichier contenant le texte ci-dessus, on verra la génération de code cible sur la sortie standard :

Execute
Prog
    Decl
    Intdecl J Prog
    Procdecl factorial I F Prog
        Decl
        Intdecl TEMP factorial
        Stmt
        Condit Designates I 0
        Then Assignint Refersto Refdesignates F 1
        Else Call factorial Difference Designates I 1 Designates TEMP factorial
             Assignint Refersto Refdesignates F Times Designates TEMP Designates I
    EndProddecl
    Stmt
    Call factorial 5 Designates J Prog


Web page maintained by Didier Parigot
Tue Aug 18 11:42:13 MET DST 1998