1 |
6 |
mcafruni |
#ifndef M_FORMATEUR_FLAG
|
2 |
|
|
#define M_FORMATEUR_FLAG
|
3 |
|
|
|
4 |
|
|
/* Modules de la bibliotheque standard */
|
5 |
|
|
|
6 |
|
|
#include <stdlib.h>
|
7 |
|
|
#include <stdio.h>
|
8 |
|
|
|
9 |
|
|
/* Autres modules utilises */
|
10 |
|
|
|
11 |
|
|
#include <dialogue.h>
|
12 |
|
|
|
13 |
|
|
|
14 |
|
|
/*********************************************************************************************/
|
15 |
|
|
/* COMPOSITION DES ENSEMBLES DE CARACTERES */
|
16 |
|
|
/* Tout autre caractere rencontre dans la source sera inconnu et renverra une erreur lors de */
|
17 |
|
|
/* sa lecture. */
|
18 |
|
|
/*********************************************************************************************/
|
19 |
|
|
|
20 |
|
|
/* D‰finition d'un code pour chaque ensemble existant */
|
21 |
|
|
#define NBR_ENS 6 /* Nombre d'ensembles existant. */
|
22 |
|
|
enum {lettre, chiffre, prefixe, sep_explicite, sep_invisible, commentaire};
|
23 |
|
|
|
24 |
|
|
/* D‰finition de constantes pour la taille de chaque ensemble existant. */
|
25 |
|
|
#define taille_lettre 56
|
26 |
|
|
#define taille_chiffre 22
|
27 |
|
|
#define taille_prefixe 6
|
28 |
|
|
#define taille_sep_explicite 11
|
29 |
|
|
#define taille_sep_invisible 3
|
30 |
|
|
#define taille_commentaire 2
|
31 |
|
|
|
32 |
|
|
/* D‰claration du tableau regroupant tous ces ensembles. */
|
33 |
|
|
extern int *ensemble[NBR_ENS];
|
34 |
|
|
|
35 |
|
|
/* D‰finition de constantes pour les valeurs des operateurs (S‰parateur explicites). */
|
36 |
|
|
#define ACF '}'
|
37 |
|
|
#define ACO '{'
|
38 |
|
|
#define NL '\n'
|
39 |
|
|
#define DP ':'
|
40 |
|
|
#define PF ')'
|
41 |
|
|
#define PO '('
|
42 |
|
|
#define PS '+'
|
43 |
|
|
#define MS '-'
|
44 |
|
|
#define DIR '#'
|
45 |
|
|
#define VIR ','
|
46 |
|
|
|
47 |
|
|
/*********************************************************************************************/
|
48 |
|
|
/* DEFINITION DES LEXEMES */
|
49 |
|
|
/* D‰finition du type lexˆme et des constantes qui s'y rapportent. */
|
50 |
|
|
/*********************************************************************************************/
|
51 |
|
|
|
52 |
|
|
/* D‰claration des diff‰rents types de lexemes possibles. Ces valeurs rempliront le champ */
|
53 |
|
|
/* type de la structure lexeme. */
|
54 |
|
|
#define ALPHA 2
|
55 |
|
|
#define NUM 4
|
56 |
|
|
#define OP 8
|
57 |
|
|
|
58 |
|
|
/* Le type des lexˆmes sera cod‰ sur 8 bits donc 1 pour la pr‰sence de valeur, 3 pour les */
|
59 |
|
|
/* trois types de base et 4 pour coder les 15 sous-types possibles. */
|
60 |
|
|
typedef unsigned char type_type_lex;
|
61 |
|
|
|
62 |
|
|
/* Definition du type lexeme. */
|
63 |
|
|
/* le type int sera utilis‰ pour coder la valeur d'un lexˆme de type op‰rateur. */
|
64 |
|
|
/* Comme celui-ci peut ‰ventuellement Štre EOF, on doit utiliser un type entier, mŠme si */
|
65 |
|
|
/* dans tous les autres cas un char aurait suffit. */
|
66 |
|
|
typedef struct
|
67 |
|
|
{
|
68 |
|
|
type_type_lex type;
|
69 |
|
|
union
|
70 |
|
|
{
|
71 |
|
|
char * alpha; /* champ pour coder la valeur d'un ALPHA */
|
72 |
|
|
int num; /* champ pour coder la valeur d'un NUM */
|
73 |
|
|
int op; /* champ pour coder la valeur d'un op‰rateur */
|
74 |
|
|
} valeur;
|
75 |
|
|
} type_lexeme;
|
76 |
|
|
|
77 |
|
|
/*********************************************************************************************/
|
78 |
|
|
/* MACROS DE TRAVAIL SUR LES LEXEMES */
|
79 |
|
|
/* D‰finition du type lexˆme et des constantes qui s'y rapportent. */
|
80 |
|
|
/*********************************************************************************************/
|
81 |
|
|
|
82 |
|
|
/* Le bit 1 du type sert a indiquer la presence d'une valeur. Pour le positionner, on */
|
83 |
|
|
/* utilise le masque d‰fini ci-dessous. */
|
84 |
|
|
#define MASK_PRESENCE_VALEUR 1
|
85 |
|
|
/* Les trois macros suivantes permettent respectivement de positionner, de lire et de retire */
|
86 |
|
|
/* le masque de pr‰sence de valeur € un type de lexˆme */
|
87 |
|
|
#define POS_MPV(type) ((type) | MASK_PRESENCE_VALEUR)
|
88 |
|
|
#define LIT_MPV(type) ((type) & MASK_PRESENCE_VALEUR)
|
89 |
|
|
#define RET_MPV(type) ((type) & ~MASK_PRESENCE_VALEUR)
|
90 |
|
|
/* Macros de lecture du type de base et du sous-type. */
|
91 |
|
|
#define BASE_TYPE(ptrlex) (((ptrlex)->type) & 0x0E) /* Masque par 00001110 */
|
92 |
|
|
#define SOUS_TYPE(ptrlex) (((ptrlex)->type) & 0xF0) /* Masque par 11110000 */
|
93 |
|
|
/* Ces macros v‰rifient si le type (ou sous type) de lexeme est bien tp (ou stp). */
|
94 |
|
|
#define TYPE_IS(ptrlex, tp) (((ptrlex)->type) & tp)
|
95 |
|
|
#define SOUS_TYPE_IS(ptrlex, stp) (SOUS_TYPE(ptrlex)==((stp) & 0xF0))
|
96 |
|
|
/* Cette macro prend le sous-type et g‰nˆre le code complet correspondant. */
|
97 |
|
|
#define CODE_TYPE(sst) (ALPHA | ((sst)<<4))
|
98 |
|
|
|
99 |
|
|
/* Comme l'allocation de lexˆmes sera une op‰ration trˆs fr‰quente, on pourra utiliser les */
|
100 |
|
|
/* macros suivantes pour simplifier le code. */
|
101 |
|
|
|
102 |
|
|
#define ALLOC_LEX(lex) {\
|
103 |
|
|
lex=((type_lexeme *) malloc(sizeof(type_lexeme)));\
|
104 |
|
|
}
|
105 |
|
|
|
106 |
|
|
#define FREE_LEX(lex) {\
|
107 |
|
|
if (TYPE_IS((lex), ALPHA) && LIT_MPV((lex)->type))\
|
108 |
|
|
free(((lex)->valeur).alpha);\
|
109 |
|
|
free(lex);\
|
110 |
|
|
}
|
111 |
|
|
|
112 |
|
|
/* MŠme si le type lexˆme n'a pas de limite pour son champ valeur.alpha, certaines fonctions */
|
113 |
|
|
/* peuvent avoir besoin d'allouer une taille maximale pour celui-ci, notament par exemple */
|
114 |
|
|
/* lors de la lecture dans un fichier du lexˆme. Dans tous les cas, le tableau vers lequel */
|
115 |
|
|
/* pointera le champ du lexˆme sera ajust‰ € sa longueur. */
|
116 |
|
|
#define MAX_LONG_ALPHA 128
|
117 |
|
|
|
118 |
|
|
/* Macro de recopie d'un lexˆme vers un autre. */
|
119 |
|
|
#define LEX_COPY(ptrl1, ptrl2) \
|
120 |
|
|
{\
|
121 |
|
|
(ptrl2)->type = (ptrl1)->type;\
|
122 |
|
|
if (LIT_MPV((ptrl1)->type)) switch BASE_TYPE(ptrl1)\
|
123 |
|
|
{\
|
124 |
|
|
case ALPHA :\
|
125 |
|
|
(ptrl2)->valeur.alpha=malloc(strlen((ptrl1)->valeur.alpha));\
|
126 |
|
|
strcpy((ptrl2)->valeur.alpha, (ptrl1)->valeur.alpha);\
|
127 |
|
|
break;\
|
128 |
|
|
case NUM :\
|
129 |
|
|
(ptrl2)->valeur.num=(ptrl1)->valeur.num;\
|
130 |
|
|
break;\
|
131 |
|
|
case OP :\
|
132 |
|
|
(ptrl2)->valeur.op=(ptrl1)->valeur.op;\
|
133 |
|
|
break;\
|
134 |
|
|
}\
|
135 |
|
|
else (ptrl2)->valeur.alpha=NULL;\
|
136 |
|
|
}
|
137 |
|
|
|
138 |
|
|
/*********************************************************************************************/
|
139 |
|
|
/* TYPES DERIVES DU TYPE LEXEME */
|
140 |
|
|
/* D‰finition du type lexˆme et des constantes qui s'y rapportent. */
|
141 |
|
|
/*********************************************************************************************/
|
142 |
|
|
|
143 |
|
|
/* D‰finition du type file de lexeme. */
|
144 |
|
|
typedef struct file_lexeme_tmp
|
145 |
|
|
{
|
146 |
|
|
struct file_lexeme_tmp * suivant ;
|
147 |
|
|
type_lexeme * lexeme ;
|
148 |
|
|
} type_file_lexeme ;
|
149 |
|
|
|
150 |
|
|
/*********************************************************************************************/
|
151 |
|
|
/* */
|
152 |
|
|
/* EXPORTATION DES POINTS D'ENTRÐE DU MODULE */
|
153 |
|
|
/* */
|
154 |
|
|
/*********************************************************************************************/
|
155 |
|
|
|
156 |
|
|
int fprint_lexeme(FILE * f, type_lexeme * l);
|
157 |
|
|
type_lexeme * get_lexeme(FILE *);
|
158 |
|
|
int strcasecmp(char * s1, char * s2);
|
159 |
|
|
int id_lexeme(type_lexeme *, type_lexeme *, int casse);
|
160 |
|
|
int filtre_lexeme(type_lexeme * l, type_lexeme * filtre, int casse);
|
161 |
|
|
|
162 |
|
|
|
163 |
|
|
#define lexcaseid(l1, l2) id_lexeme(l1, l2, 0)
|
164 |
|
|
#define lexid(l1, l2) id_lexeme(l1, l2, 1)
|
165 |
|
|
#define lexcaseftr(l, filtre) filtre_lexeme(l1, filtre, 0)
|
166 |
|
|
#define lexftr(l, filtre) filtre_lexeme(l, filtre, 1)
|
167 |
|
|
|
168 |
|
|
#endif
|