/* ce fichier est un exemple pour le projet "Préprocesseur de macros" (Licence Informatique u-bordeaux 1999-2000). */ Tout d abord le prepro doit etre capable de lire un simple texte comme celui-ci tout /* en excluant les commentaires,*/ en \ reconstituant les lignes brisées \\ meme quand on double le contre-oblique ! Ensuite, le prepro doit etre capable de traiter des macros constantes comme les suivantes : #define NOM_DE_LA_MACRO la definition de la macro #define prepro préprocesseur de\ macros-commandes #define chaines caractères #define POINT_VIRGULE; #define vide Attention le traitement du prepro ne doit pas s appliquer "aux chaines" ni aux 'chaines' mais aux (chaines). En fait les "chaines" doivent etre considéré comme des mots. Une macro-constante ca commence toujours en début de ligne POINT_VIRGULE ainsi, cette directive #define ne définie pas une macro. vide vide vide vide vide Cependant les espaces et tabulations ne jouent pas un grand role # define thors exemple contrairement aux autres caratères par thors # ; define ce n est pas une macro Attention le nom d une macro commence soit par _ soit par une lettre #define 1_un 2 Dans le cas d une mauvaise definition comme ci-dessus (1_un) il serait bon de produire une erreur et d arreter le traitement. ensuite il faut implementer la directive #undef qui permet de supprimer une macro commande par exemple supprimons la macro prepro #undef prepro On retrouve le prepro. Apres on peut s interesser aux definitions cascadées, cela demande une petit travail algorithmique : un #define un deux un #define deux trois un #define trois un un #undef trois un #define trois deux un D autre part il faudra aussi implémenter les directives sur les inclusions conditionnelles #ifdef #ifndef #else #endif #ifdef un la macro "un" est definie : [un] #else la macro "un" n est pas définie : [un] #endif #ifdef toto la macro "toto" est definie : [toto] #else la macro "toto" n est pas définie : [toto] #undef un #ifdef un la macro "un" est definie : [un] #else la macro "un" n est pas définie : [un] #endif #endif la macro __LINE__ devrait etre facile a implémenter