From f8d45dd1aa11b119e011dcf280193ab60970df4c Mon Sep 17 00:00:00 2001 From: Henrique Margotte <henriquemargotte@gmail.com> Date: Sun, 1 Dec 2024 12:09:27 -0300 Subject: [PATCH] em processo de paramentros --- compilador.y | 15 +++++++++++++++ ts/ts.c | 16 ++++++++++++++++ ts/ts.h | 2 ++ 3 files changed, 33 insertions(+) diff --git a/compilador.y b/compilador.y index e10c0ea..d13a16b 100644 --- a/compilador.y +++ b/compilador.y @@ -176,6 +176,7 @@ declaracao_procedimento: PROCEDURE IDENT { geraCodigo(r_proc,buffer); mostra_ts(ts); } + parametros_ou_nada PONTO_E_VIRGULA bloco { // Retorna ao nível léxico anterior e mantém o deslocamento atualizado @@ -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 ; diff --git a/ts/ts.c b/ts/ts.c index c546593..d4a2d34 100644 --- a/ts/ts.c +++ b/ts/ts.c @@ -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) { if (ts == NULL || ts->topo == NULL) { printf("Tabela de Símbolos está vazia ou não inicializada.\n"); diff --git a/ts/ts.h b/ts/ts.h index c2c5825..7cefb19 100644 --- a/ts/ts.h +++ b/ts/ts.h @@ -61,6 +61,8 @@ void retira(int n, 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); #endif -- GitLab