Skip to content
Snippets Groups Projects
Commit f8d45dd1 authored by Henrique Margotte's avatar Henrique Margotte
Browse files

em processo de paramentros

parent 0cb193d0
No related branches found
No related tags found
No related merge requests found
...@@ -176,6 +176,7 @@ declaracao_procedimento: PROCEDURE IDENT { ...@@ -176,6 +176,7 @@ declaracao_procedimento: PROCEDURE IDENT {
geraCodigo(r_proc,buffer); geraCodigo(r_proc,buffer);
mostra_ts(ts); mostra_ts(ts);
} }
parametros_ou_nada
PONTO_E_VIRGULA bloco PONTO_E_VIRGULA bloco
{ {
// Retorna ao nível léxico anterior e mantém o deslocamento atualizado // Retorna ao nível léxico anterior e mantém o deslocamento atualizado
...@@ -183,6 +184,20 @@ declaracao_procedimento: PROCEDURE IDENT { ...@@ -183,6 +184,20 @@ declaracao_procedimento: PROCEDURE IDENT {
} }
; ;
parametros_ou_nada: ABRE_PARENTESES paramentros_formais FECHA_PARENTESES
|
;
paramentros_formais: secao_pfs
| paramentros PONTO_E_VIRGULA secao_pfs
;
secao_pfs: lista_id_pf DOIS_PONTOS tipo
parametro: IDENT {
}
;
comando_composto: T_BEGIN comandos T_END comando_composto: T_BEGIN comandos T_END
; ;
......
...@@ -82,6 +82,22 @@ void atualiza_tipo(int n, int tipo, ts_t *ts){ ...@@ -82,6 +82,22 @@ void atualiza_tipo(int n, int tipo, ts_t *ts){
} }
} }
void adiciona_param(char *ident, int n, int tipo, int passagem, ts_t *ts){
if(ts == NULL || ts->topo == NULL || n <= 0) return;
// Add n parameters to ident procedure params
simb_t *p = busca(ident, ts);
if (p == NULL || p->categ != PR) return;
p->info.pr.param = (int **)realloc(p->info.pr.param, (p->info.pr.quant + n) * sizeof(int *));
for (int i = p->info.pr.quant; i < p->info.pr.quant + n; i++) {
p->info.pr.param[i] = (int *)malloc(2 * sizeof(int));
p->info.pr.param[i][0] = tipo;
p->info.pr.param[i][1] = passagem;
}
p->info.pr.quant += n;
}
void mostra_ts(ts_t *ts) { void mostra_ts(ts_t *ts) {
if (ts == NULL || ts->topo == NULL) { if (ts == NULL || ts->topo == NULL) {
printf("Tabela de Símbolos está vazia ou não inicializada.\n"); printf("Tabela de Símbolos está vazia ou não inicializada.\n");
......
...@@ -61,6 +61,8 @@ void retira(int n, ts_t *ts); ...@@ -61,6 +61,8 @@ void retira(int n, ts_t *ts);
void atualiza_tipo(int n, int tipo, ts_t *ts); void atualiza_tipo(int n, int tipo, ts_t *ts);
void adiciona_param(char *ident, int n, int tipo, int passagem, ts_t *ts);
void mostra_ts(ts_t *ts); void mostra_ts(ts_t *ts);
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment