1 |
6 |
mcafruni |
/*********************************************************************************************/
|
2 |
|
|
/* MODULE ANALYSEUR */
|
3 |
|
|
/* Ce module a pour but de parcourir le fichier assembleur en effectuant la correspondance */
|
4 |
|
|
/* du code source avec la syntaxe acceptée par le langage. La lecture se fait lexème par */
|
5 |
|
|
/* lexème en utilisant le préprocesseur. */
|
6 |
|
|
/* Il se charge de générer la pile de précode qu sera utilisée par le syntéthiseur pour */
|
7 |
|
|
/* générer le code final. */
|
8 |
|
|
/*********************************************************************************************/
|
9 |
|
|
#ifndef M_ANALYSEUR_FLAG
|
10 |
|
|
#define M_ANALYSEUR_FLAG
|
11 |
|
|
|
12 |
|
|
#include <parametres.h>
|
13 |
|
|
#include <adaptateur.h>
|
14 |
|
|
#include <preparateur.h>
|
15 |
|
|
|
16 |
|
|
typedef struct file_pcd_tmp
|
17 |
|
|
{
|
18 |
|
|
type_mask * mask; /* Masque déjà généré à la première passe. */
|
19 |
|
|
char nbr_func; /* Nombre de fonctions restant à appliquer. */
|
20 |
|
|
type_ptr_fgm * func; /* Tableau des pointeurs vers ces fonctions. */
|
21 |
|
|
type_file_lexeme * param; /* File de lexèmes ayant validé l'intruction. */
|
22 |
|
|
char * fichier_orig; /* Nom du fichier d'origine de l'instruction. */
|
23 |
|
|
int ligne_orig; /* Numéro de la ligne de l'instruction. */
|
24 |
|
|
struct file_pcd_tmp * suivant; /* Pointeur vers la suite de la file de precode. */
|
25 |
|
|
int erreur; /* Code d'erreur rencontré. */
|
26 |
|
|
int pco; /* Adresse d'implantation. */
|
27 |
|
|
} type_precode;
|
28 |
|
|
|
29 |
|
|
|
30 |
|
|
extern type_precode * file_precode; /* Pointeur vers la file de précode générée. */
|
31 |
|
|
|
32 |
|
|
int analyse(); /* Point d'entrée principal du module. */
|
33 |
|
|
void clear_analyseur(); /* Fonction de nettoyage/réinitialisation du module. */
|
34 |
|
|
|
35 |
|
|
/* Macro d'allocation et d'initialisation d'un précode. */
|
36 |
|
|
#define ALLOC_PREC(prec) \
|
37 |
|
|
{\
|
38 |
|
|
prec = (type_precode *) malloc(sizeof(type_precode));\
|
39 |
|
|
if (prec==NULL) DIALOGUE(msg_orig, 0, F_ERR_MEM);\
|
40 |
|
|
prec->fichier_orig=NULL;\
|
41 |
|
|
prec->ligne_orig=0;\
|
42 |
|
|
prec->mask=NULL;\
|
43 |
|
|
prec->nbr_func=0;\
|
44 |
|
|
prec->func=NULL;\
|
45 |
|
|
prec->param=NULL;\
|
46 |
|
|
prec->suivant=NULL;\
|
47 |
|
|
prec->erreur=NO_ERR;\
|
48 |
|
|
}
|
49 |
|
|
|
50 |
|
|
/* Cette macro libère l'espace alloué pour une file de lexèmes. */
|
51 |
|
|
#define FREE_ARGS(args) \
|
52 |
|
|
{\
|
53 |
|
|
type_file_lexeme * courant=args, * suivant;\
|
54 |
|
|
while (courant!=NULL)\
|
55 |
|
|
{\
|
56 |
|
|
suivant=courant->suivant;\
|
57 |
|
|
FREE_LEX(courant->lexeme);\
|
58 |
|
|
free(courant);\
|
59 |
|
|
courant=suivant;\
|
60 |
|
|
}\
|
61 |
|
|
args=NULL;\
|
62 |
|
|
}
|
63 |
|
|
|
64 |
|
|
/* Cette macro libère l'espace alloué pour un précode. */
|
65 |
|
|
#define FREE_PRECODE(precode) \
|
66 |
|
|
{\
|
67 |
|
|
if (precode->mask) FREE_MASK(precode->mask);\
|
68 |
|
|
if (precode->nbr_func!=0 && precode->func!=NULL) free(precode->func);\
|
69 |
|
|
FREE_ARGS(precode->param);\
|
70 |
|
|
if (precode->fichier_orig) free(precode->fichier_orig);\
|
71 |
|
|
if (precode->func) free(precode->func);\
|
72 |
|
|
free(precode);\
|
73 |
|
|
}
|
74 |
|
|
|
75 |
|
|
/* Cette macro efface et libère le contenu d'un précode mais pas la structure elle_même. */
|
76 |
|
|
/* On conserve toutefois les informations sur l'origine. */
|
77 |
|
|
#define CLEAR_PRECODE(precode) \
|
78 |
|
|
{\
|
79 |
|
|
if (precode->mask) FREE_MASK(precode->mask);\
|
80 |
|
|
precode->mask=NULL;\
|
81 |
|
|
if (precode->nbr_func!=0 && precode->func!=NULL) free(precode->func);\
|
82 |
|
|
precode->func=NULL;\
|
83 |
|
|
FREE_ARGS(precode->param);\
|
84 |
|
|
precode->param=NULL;\
|
85 |
|
|
precode->nbr_func=0;\
|
86 |
|
|
}
|
87 |
|
|
|
88 |
|
|
|
89 |
|
|
/* Cette macro peut être utilisée pour écrire un masque sous forme "lisible". */
|
90 |
|
|
#define FPRINT_BIN(f, ptrmask) \
|
91 |
|
|
{\
|
92 |
|
|
int i;\
|
93 |
|
|
if (ptrmask)\
|
94 |
|
|
{\
|
95 |
|
|
for (i=8*ptrmask->taille-1;i>=0;i--)\
|
96 |
|
|
fprintf(f, "%c",((ptrmask->valeur>>i) % 2) ? '1' : '0');\
|
97 |
|
|
}\
|
98 |
|
|
}
|
99 |
|
|
|
100 |
|
|
#endif
|