Skip to content
Snippets Groups Projects
Commit d44c0a3c authored by Tiago Henrique Conte's avatar Tiago Henrique Conte
Browse files

Implementa forward

parent 8451a796
No related branches found
No related tags found
No related merge requests found
......@@ -65,7 +65,8 @@ typedef enum simbolos {
simb_integer,
simb_boolean,
simb_read,
simb_write
simb_write,
simb_forward
} simbolos;
typedef enum operacoes_t {
......
......@@ -281,6 +281,12 @@ write { simbolo = simb_write;
return WRITE;
}
forward { simbolo = simb_forward;
strncpy (token, yytext, TAM_TOKEN);
IMPRIME(" forward ");
return FORWARD;
}
{numero} { simbolo = simb_numero;
strncpy (token, yytext, TAM_TOKEN);
IMPRIME(" numero ");
......
......@@ -38,7 +38,7 @@ char ident[50];
%token T_BEGIN T_END VAR NUMERO IDENT ATRIBUICAO
%token PROCEDURE FUNCTION GOTO LABEL ARRAY OF
%token IF THEN ELSE WHILE DO INTEGER BOOLEAN
%token READ WRITE
%token READ WRITE FORWARD
/* Para funcionar o IF THEN ELSE
Precedências são crescentes, logo "lower_than_else" < "else" */
......@@ -175,25 +175,34 @@ parte_declara_subrotinas:
declara_proc: PROCEDURE IDENT
{
// fprintf(stderr, "Ident: %s\n", token);
char *rotulo;
stack_push(rotulos, next_rot());
nivelLex++;
// Gera ENPR k com rotulo
rotulo = stack_item(rotulos, rotulos->top);
sprintf(comando, "ENPR %d", nivelLex);
geraCodigo(rotulo, comando);
// Adiciona procedimento à tabela de simbolos
if (buscaTS(token) == -1) {
stack_push(rotulos, next_rot());
rotulo = stack_item(rotulos, rotulos->top);
insereTS(token, cat_procedimento,
criaAtrProcedimento(rotulo));
}
}
param_formais
PONTO_E_VIRGULA bloco PONTO_E_VIRGULA
PONTO_E_VIRGULA declara_proc_extra
;
/* REGRA 12 - extra */
declara_proc_extra: FORWARD PONTO_E_VIRGULA { nivelLex--; }
| {
char *rotulo;
// Gera ENPR k com rotulo
rotulo = stack_item(rotulos, rotulos->top);
sprintf(comando, "ENPR %d", nivelLex);
geraCodigo(rotulo, comando);
} bloco PONTO_E_VIRGULA
{
char *rotulo;
......@@ -220,17 +229,14 @@ declara_func: FUNCTION IDENT
char *rotulo;
stack_push(rotulos, next_rot());
nivelLex++;
// Gera ENPR k com rotulo
// Se não existe, adiciona função à tabela de simbolos
if (buscaTS(token) == -1) {
stack_push(rotulos, next_rot());
rotulo = stack_item(rotulos, rotulos->top);
sprintf(comando, "ENPR %d", nivelLex);
geraCodigo(rotulo, comando);
// Adiciona função à tabela de simbolos
insereTS(token, cat_funcao, criaAtrFuncao(rotulo));
}
}
param_formais DOIS_PONTOS tipo
......@@ -246,7 +252,20 @@ declara_func: FUNCTION IDENT
break;
}
}
PONTO_E_VIRGULA bloco PONTO_E_VIRGULA
PONTO_E_VIRGULA declara_func_extra
;
/* REGRA 13 - extra */
declara_func_extra: FORWARD PONTO_E_VIRGULA { nivelLex--; }
| {
char *rotulo;
// Gera ENPR k com rotulo
rotulo = stack_item(rotulos, rotulos->top);
sprintf(comando, "ENPR %d", nivelLex);
geraCodigo(rotulo, comando);
} bloco PONTO_E_VIRGULA
{
char *rotulo;
......@@ -567,6 +586,7 @@ comando_repetitivo: WHILE
/* REGRA 24 */
lista_expr: lista_expr VIRGULA { num_params++; } expr
| expr
|
;
/* REGRA 25 */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment