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] - Blame information for rev 17

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
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

powered by: WebSVN 2.1.0

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