Skip to content

Commit

Permalink
Terminada regra de corpo vazio
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielVenturini committed Oct 27, 2018
1 parent ffc74ac commit 915b140
Showing 1 changed file with 32 additions and 10 deletions.
42 changes: 32 additions & 10 deletions syntactic/parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ TreeNode *inicializacao_variaveis();
TreeNode *operador_multiplicacao();
TreeNode *declaracao_variaveis();
TreeNode *operador_relacional();
TreeNode *corpo(char instrucao);
TreeNode *lista_declaracoes();
TreeNode *expressao_aditiva();
TreeNode *expressao_simples();
Expand All @@ -29,7 +30,6 @@ TreeNode *retorna();
TreeNode *indice();
TreeNode *repita();
TreeNode *numero();
TreeNode *corpo();
TreeNode *fator();
TreeNode *vazio();
TreeNode *leia();
Expand Down Expand Up @@ -111,7 +111,6 @@ TreeNode *lista_argumentos() {

// vazio
if(atual()->tokenval == FECHA_PARENTESES){
printf("OI\n");
insere_filho(lista_argumentos, vazio());
return lista_argumentos;
}
Expand Down Expand Up @@ -575,7 +574,7 @@ TreeNode *repita() {

TreeNode *repita = novo_node(NULL, B_REPITA);
insere_filho(repita, novo_node(atualEAvanca(), -1));// adicionando o REPITA
insere_filho(repita, corpo()); // adiciona o corpo
insere_filho(repita, corpo('R')); // adiciona o corpo

if(atual()->tokenval != ATE){
printf("Err repita\n");
Expand Down Expand Up @@ -603,12 +602,12 @@ TreeNode *se() {
}

insere_filho(se, novo_node(atualEAvanca(), -1));// insere como filho o ENTAO
insere_filho(se, corpo()); // adiciona como filho o corpo
insere_filho(se, corpo('S')); // adiciona como filho o corpo

// parte opcional
if(atual()->tokenval == SENAO){
insere_filho(se, novo_node(atualEAvanca(), -1));// adiciona o SENÃO
insere_filho(se, corpo()); // insere o corpo do SENÃO
insere_filho(se, corpo('S')); // insere o corpo do SENÃO
}

if(atual()->tokenval != FIM){
Expand Down Expand Up @@ -676,15 +675,38 @@ TreeNode *acao() {
}

// corpo acao | vazio
TreeNode *corpo() {
// se a instrução for um CABECALHO, e o próximo token for um FIM, então o corpo é vazio
// se a instrução for um SE e o próximo token for um FIM ou SENÃO, então o corpo é vazio
// se a instrução for um REPITA e o próximo token for um ATE, então o corpo é vazio
TreeNode *corpo(char instrucao) {

TreeNode *corpo = novo_node(NULL, CORPO);

// pode ser vazio
while(atual()->tokenval != FIM && atual()->tokenval != ATE && atual()->tokenval != SENAO){
insere_filho(corpo, acao());
switch(instrucao) {
case 'C': // cabecalho
if(atual()->tokenval == FIM) {
insere_filho(corpo, vazio());
return corpo;
}

case 'S': // se
if(atual()->tokenval == FIM || atual()->tokenval == SENAO) {
insere_filho(corpo, vazio());
return corpo;
}

case 'R': // repita
if(atual()->tokenval == ATE) {
insere_filho(corpo, vazio());
return corpo;
}
}

// não precisa da primeira verificação
do {
insere_filho(corpo, acao());
} while(atual()->tokenval != FIM && atual()->tokenval != ATE && atual()->tokenval != SENAO);

return corpo;
}

Expand Down Expand Up @@ -783,7 +805,7 @@ TreeNode *cabecalho() {
}

insere_filho(cabecalho, novo_node(atualEAvanca(), -1)); // insere como filho o ")"
insere_filho(cabecalho, corpo()); // insere como filho o corpo
insere_filho(cabecalho, corpo('C')); // insere como filho o corpo

if(atual()->tokenval != FIM){
printf("Err cabecalho..\n");
Expand Down

0 comments on commit 915b140

Please sign in to comment.