-
Notifications
You must be signed in to change notification settings - Fork 0
/
Tabela.h
164 lines (145 loc) · 4.79 KB
/
Tabela.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
Compilador PORTUGOL v.2q
Autor: Ruben Carlo Benante
Email: benante@gmail.com
Data criação: 23/04/2009
Data modificação: 24/05/2009
*/
#define MAX_SIMB 200
#define STACK_SIZE 200
#define FUNC_NAME_SIZE 32
#define MAX_PARAM 4
#define MAX_SVAL 256
/* Tipos de Base */
//char *sTipoBase[4]={"tipoIndef", "tipoInt", "tipoFloat", "tipoStr"};
typedef enum
{
tipoIndef,
tipoInt,
tipoFloat,
tipoStr,
tipoVoid
} tipoBase;
/* Tipos de Dados da Tabela de Simbolos */
//char *sTipoDado[14]={"tipoIdIndef", "tipoConInt", "tipoConFloat", "tipoConStr", "tipoIdInt", "tipoIdFloat", "tipoIdStr", "tipoIdFuncInt", "tipoIdFuncFloat", "tipoIdFuncDouble", "tipoIdFuncChar", "tipoIdFuncStr", "tipoIdFuncVoid", "tipoIdFuncPVoid"};
typedef enum
{
tipoIdIndef,
tipoConInt,
tipoConFloat,
tipoConStr,
tipoIdInt,
tipoIdFloat,
tipoIdStr,
tipoIdFuncInt,
tipoIdFuncFloat,
tipoIdFuncDouble,
tipoIdFuncChar,
tipoIdFuncStr,
tipoIdFuncVoid,
tipoIdFuncPVoid
} tipoDado;
/* Tipos de Nodos */
typedef enum
{
tipoSimb,
tipoOper
} tipoNodo;
typedef enum
{
tipoRetFuncInt,
tipoRetFuncFloat,
tipoRetFuncDouble,
tipoRetFuncChar,
tipoRetFuncStr,
tipoRetFuncVoid,
tipoRetFuncPVoid
} tipoRetFunc;
/* Super Tipo */
typedef struct
{
tipoBase tipo;
int ival;
float fval;
char sval[MAX_SVAL];
} superTipo;
/* Super Func */
typedef struct
{
tipoRetFunc tipoRet;
tipoBase tipoParam[MAX_PARAM];
int numParam;
char *idNome;
int (*ifunc)(); //ponteiro para funcao que retorna inteiro
float (*ffunc)(); //ponteiro para funcao que retorna float
double (*dfunc)(); //ponteiro para funcao que retorna double
char (*cfunc)(); //ponteiro para funcao que retorna char
char *(*sfunc)(); //ponteiro para funcao que retorna ponteiro para char
void (*vfunc)(); //ponteiro para a funcao que retorna void
void *(*pfunc)(); //ponteiro para a funcao que retorna ponteiro para void
} superFunc;
/* tabela de simbolos */
typedef struct tabelaSimb
{
tipoDado tipoD;
int idx; /* ts[idx] ou tf[idx]*/
int uso; //verdadeiro se ja usou
int load; //verdadeiro se ja carregou na tabela de simbolos de execucao
char *idNome; //nome da variavel ou funcao em Portugol
char *idFunc; //nome da funcao em C
int ival; //valor da constante inteira
float fval; //valor da constante real
char *sval; //valor da constante texto
char *tval; //valor para geracao de codigo
int numParam; //numero de parametros recebidos pela funcao
int (*ifunc)(); //ponteiro para funcao que retorna inteiro
float (*ffunc)(); //ponteiro para funcao que retorna double
double (*dfunc)(); //ponteiro para funcao que retorna double
char *(*sfunc)(); //ponteiro para funcao que retorna ponteiro para char
void (*vfunc)(); //ponteiro para a funcao que retorna void
} tabelaSimb;
/* operadores */
typedef struct
{
tipoBase tipoBOper; /* apos executado, seu tipo de retorno */
int oper; /* o operador */
int nops; /* numero de operandos */
struct uNodo *ptn[1]; /* [MAX_OPER]; os operandos (expansivel) tam = sizeof(nodo) + (nops - 1) * sizeof(nodo *); */
} nodoOper;
/* Nodo */
typedef struct uNodo
{
int linha; /* linha da criacao */
tipoNodo tipoN; /* tipo de nodo: simb ou oper */
tabelaSimb *pSimb; /* ponteiro para tabela de simbolos com identificadores e constantes */
nodoOper opr; /* operadores */
} nodo;
tabelaSimb tabSimb[MAX_SIMB];
tabelaSimb *achaId(char *nome);
tabelaSimb *achaInt(int iv);
tabelaSimb *achaFloat(float fv);
tabelaSimb *achaStr(char *sv);
tabelaSimb *achaFuncs(char *nome);
void iniciarTabelaSimb();
//extern FILE *yyin, *yyout;
//extern FILE *fhead;
char *geraLB(int *i);
char *geraTP(int *i);
int geraTF(void); //tabela de funcoes
int geraTC(void); //tabela de constantes
int geraTS(void); //tabela de variaveis
char *nomeTipo(nodo *p); //retorna o nome do tipoDado ou tipoBase
void geraSaidaH();
void addFuncDouble(char *id, double (*func)(), char *idF);
void addFuncVoid(char *id, void (*func)(), char *idF);
void addConStr(char *s);
void yyerror(char *s);
extern int lineno;
void printNodo(nodo *tn, int n, char *var);
void printTS(void);
int pegaTipoBase(nodo *p);
void erroSemantico(char *s, int linha);
nodo *opr(int oper, int nops, ...);
nodo *conv(tabelaSimb *ps);
void liberaNodo(nodo *tn);
char *token(int tk);