OpenCores
URL https://opencores.org/ocsvn/minimips_superscalar/minimips_superscalar/trunk

Subversion Repositories minimips_superscalar

[/] [minimips_superscalar/] [trunk/] [gasm_with_mult2_instruction/] [include/] [formateur.h] - Rev 6

Compare with Previous | Blame | View Log

#ifndef M_FORMATEUR_FLAG
#define M_FORMATEUR_FLAG
 
/* Modules de la bibliotheque standard                                                       */
 
#include <stdlib.h>
#include <stdio.h>
 
/* Autres modules utilises                                                                   */
 
#include <dialogue.h>
 
 
/*********************************************************************************************/
/*                          COMPOSITION DES ENSEMBLES DE CARACTERES                          */
/* Tout autre caractere rencontre dans la source sera inconnu et renverra une erreur lors de */
/* sa lecture.                                                                               */
/*********************************************************************************************/
 
/* D‰finition d'un code pour chaque ensemble existant                                        */
#define NBR_ENS         6       /* Nombre d'ensembles existant.                              */
enum {lettre, chiffre, prefixe, sep_explicite, sep_invisible, commentaire};
 
/* D‰finition de constantes pour la taille de chaque ensemble existant.                      */
#define taille_lettre           56
#define taille_chiffre          22
#define taille_prefixe          6
#define taille_sep_explicite    11
#define taille_sep_invisible    3
#define taille_commentaire      2
 
/* D‰claration du tableau regroupant tous ces ensembles.                                     */
extern int *ensemble[NBR_ENS];
 
/* D‰finition de constantes pour les valeurs des operateurs (S‰parateur explicites).         */
#define ACF     '}'
#define ACO     '{'
#define NL      '\n'    
#define DP      ':'     
#define PF      ')'
#define PO      '('     
#define PS      '+'     
#define MS      '-'     
#define DIR     '#'     
#define VIR     ','     
 
/*********************************************************************************************/
/*                                   DEFINITION DES LEXEMES                                  */
/* D‰finition du type lexˆme et des constantes qui s'y rapportent.                           */
/*********************************************************************************************/
 
/* D‰claration des diff‰rents types de lexemes possibles. Ces valeurs rempliront le champ    */
/* type de la structure lexeme.                                                              */
#define ALPHA   2
#define NUM     4
#define OP      8
 
/* Le type des lexˆmes sera cod‰ sur 8 bits donc 1 pour la pr‰sence de valeur, 3 pour les    */
/* trois types de base et 4 pour coder les 15 sous-types possibles.                          */
typedef unsigned char type_type_lex;
 
/* Definition du type lexeme.                                                                */
/* le type int sera utilis‰ pour coder la valeur d'un lexˆme de type op‰rateur.              */
/* Comme celui-ci peut ‰ventuellement Štre EOF, on doit utiliser un type entier, mŠme si     */
/* dans tous les autres cas un char aurait suffit.                                           */
typedef struct
{
        type_type_lex type;
        union
        {
                char * alpha;   /* champ pour coder la valeur d'un ALPHA                     */
                int num;        /* champ pour coder la valeur d'un NUM                       */
                int op;         /* champ pour coder la valeur d'un op‰rateur                 */
        }  valeur;
} type_lexeme;
 
/*********************************************************************************************/
/*                               MACROS DE TRAVAIL SUR LES LEXEMES                           */
/* D‰finition du type lexˆme et des constantes qui s'y rapportent.                           */
/*********************************************************************************************/
 
/* Le bit 1 du type sert a indiquer la presence d'une valeur. Pour le positionner, on        */
/* utilise le masque d‰fini ci-dessous.                                                      */
#define MASK_PRESENCE_VALEUR    1
/* Les trois macros suivantes permettent respectivement de positionner, de lire et de retire */
/* le masque de pr‰sence de valeur € un type de lexˆme                                       */
#define POS_MPV(type)   ((type) | MASK_PRESENCE_VALEUR)
#define LIT_MPV(type)   ((type) & MASK_PRESENCE_VALEUR)
#define RET_MPV(type)   ((type) & ~MASK_PRESENCE_VALEUR)
/* Macros de lecture du type de base et du sous-type.                                        */
#define BASE_TYPE(ptrlex)       (((ptrlex)->type) & 0x0E)       /* Masque par 00001110       */
#define SOUS_TYPE(ptrlex)       (((ptrlex)->type) & 0xF0)       /* Masque par 11110000       */
/* Ces macros v‰rifient si le type (ou sous type) de lexeme est bien tp (ou stp).            */
#define TYPE_IS(ptrlex, tp)             (((ptrlex)->type) & tp)
#define SOUS_TYPE_IS(ptrlex, stp)       (SOUS_TYPE(ptrlex)==((stp) & 0xF0))
/* Cette macro prend le sous-type et g‰nˆre le code complet correspondant.                   */
#define CODE_TYPE(sst)          (ALPHA | ((sst)<<4))
 
/* Comme l'allocation de lexˆmes sera une op‰ration trˆs fr‰quente, on pourra utiliser les   */
/* macros suivantes pour simplifier le code.                                                 */
 
#define ALLOC_LEX(lex)  {\
                                lex=((type_lexeme *) malloc(sizeof(type_lexeme)));\
                        }
 
#define FREE_LEX(lex)   {\
                                if (TYPE_IS((lex), ALPHA) && LIT_MPV((lex)->type))\
                                        free(((lex)->valeur).alpha);\
                                free(lex);\
                        }
 
/* MŠme si le type lexˆme n'a pas de limite pour son champ valeur.alpha, certaines fonctions */
/* peuvent avoir besoin d'allouer une taille maximale pour celui-ci, notament par exemple    */
/* lors de la lecture dans un fichier du lexˆme. Dans tous les cas, le tableau vers lequel   */
/* pointera le champ du lexˆme sera ajust‰ € sa longueur.                                    */
#define MAX_LONG_ALPHA          128
 
/* Macro de recopie d'un lexˆme vers un autre.                                               */
#define LEX_COPY(ptrl1, ptrl2)  \
{\
        (ptrl2)->type = (ptrl1)->type;\
        if (LIT_MPV((ptrl1)->type)) switch BASE_TYPE(ptrl1)\
        {\
                case ALPHA :\
                        (ptrl2)->valeur.alpha=malloc(strlen((ptrl1)->valeur.alpha));\
                        strcpy((ptrl2)->valeur.alpha, (ptrl1)->valeur.alpha);\
                        break;\
                case NUM :\
                        (ptrl2)->valeur.num=(ptrl1)->valeur.num;\
                        break;\
                case OP :\
                        (ptrl2)->valeur.op=(ptrl1)->valeur.op;\
                        break;\
         }\
        else (ptrl2)->valeur.alpha=NULL;\
}
 
/*********************************************************************************************/
/*                                TYPES DERIVES DU TYPE LEXEME                               */
/* D‰finition du type lexˆme et des constantes qui s'y rapportent.                           */
/*********************************************************************************************/
 
/* D‰finition du type file de lexeme.                                                        */
typedef struct file_lexeme_tmp
{
        struct file_lexeme_tmp * suivant ;
        type_lexeme * lexeme ;
} type_file_lexeme ;
 
/*********************************************************************************************/
/*                                                                                           */
/*                         EXPORTATION DES POINTS D'ENTRÐE DU MODULE                         */
/*                                                                                           */
/*********************************************************************************************/
 
int fprint_lexeme(FILE * f, type_lexeme * l);
type_lexeme * get_lexeme(FILE *);
int strcasecmp(char * s1, char * s2);
int id_lexeme(type_lexeme *, type_lexeme *, int casse);
int filtre_lexeme(type_lexeme * l, type_lexeme * filtre, int casse);
 
 
#define lexcaseid(l1, l2)       id_lexeme(l1, l2, 0)
#define lexid(l1, l2)           id_lexeme(l1, l2, 1)
#define lexcaseftr(l, filtre)   filtre_lexeme(l1, filtre, 0)
#define lexftr(l, filtre)       filtre_lexeme(l, filtre, 1)
 
#endif
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.