-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathast.h
59 lines (51 loc) · 2.11 KB
/
ast.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
// Cet enum contient tous les types possibles pour un noeud "operator"
typedef enum { OPER_ADD, OPER_SUB, OPER_MULT, OPER_DIV, OPER_WRITE,
OPER_SKIP, OPER_IF, OPER_WHILE, OPER_FOR, OPER_DO_WHILE, OPER_SEQUENCE, OPER_APPEL_FONCTION,
OPER_INF, OPER_SUP, OPER_GE, OPER_LE, OPER_NE, OPER_EQ,
OPER_NOT, OPER_AND, OPER_OR, OPER_NEG, OPER_ASSIGN,
OPER_DEF_FONCTION, OPER_RETURN,
OPER_RESERVE_SPACE, OPER_MAIN } nodeOper;
// Les deux types de noeuds possibles, "numeric" ou "operator"
typedef enum { typeNumeric, typeOperator, typeIdentifier } nodeEnum;
/* un noeud numeric (float) permet de stocker une valeur reelle */
typedef struct {
float valeur;
} numericNodeType;
/* un noeud operator permet de stocker un operateur, le nombre d'operandes et les pointeurs vers les noeuds
operande correspondants */
typedef struct {
int oper;
int nOperands;
struct nodeTypeTag **op;
} operatorNodeType;
/* un noeud identifier fait reference a un identificateur */
typedef struct {
char *ident;
int funcNum;
int index;
} identifierNodeType;
/* Cette structure, fondamentale, permet de definir un noeud a geometrie variable. Le type
permet de definir le type du noeud (numeric ou operator) et l'union permet, en fonction
du type, d'acceder aux bonnes informations */
typedef struct nodeTypeTag {
nodeEnum type;
int digraphNode; // Pour generer des beaux graphes avec dot
union {
numericNodeType t_numeric;
operatorNodeType t_oper;
identifierNodeType t_identifier;
};
} nodeType;
// La, il faudrait mettre les extern de toutes les fonctions definies dans ast.c
extern nodeType *createNumericNode(float v);
extern nodeType *createIdentifierNode(char *id, int funcNum, int index);
extern nodeType *createOperatorNode(int oper, int nOperands, ...);
extern void generateAsmRec(nodeType *n, FILE *fout, char* nom);
void generateAsmExpression(nodeType *n, FILE *fout);
extern void generateAsm(nodeType *n, char *filename);
extern void generateDigraphEdges(nodeType *n,FILE *fout);
extern void generateDigraph(nodeType *n);