Skip to content

Commit

Permalink
Merge pull request #5 from DanielVenturini/análise_sintática
Browse files Browse the repository at this point in the history
Análise sintática completa
  • Loading branch information
DanielVenturini authored Oct 27, 2018
2 parents a58edcf + 915b140 commit 8d508a0
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 12 deletions.
2 changes: 2 additions & 0 deletions desacerto.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,4 +96,6 @@ void erro(char *nomeArquivo, TokenRecord *token, char *msgErro) {
printInformacoes(nomeArquivo, token, msgErro);
avancaLinha(token->numline);
printLine(token->numline, token->numcaracter);

exit(0);
}
1 change: 0 additions & 1 deletion desacerto.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

#include <stdio.h>
#include "lexical/varredura.h"
#include "syntactic/conjunto.h"

/********************************************************************
* DEFINICAO DAS FUNÇÕES *
Expand Down
50 changes: 40 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,8 +30,8 @@ TreeNode *retorna();
TreeNode *indice();
TreeNode *repita();
TreeNode *numero();
TreeNode *corpo();
TreeNode *fator();
TreeNode *vazio();
TreeNode *leia();
TreeNode *tipo();
TreeNode *acao();
Expand Down Expand Up @@ -98,13 +99,19 @@ TreeNode *criaPrograma() {
return novo_node(NULL, PROGRAMA);
}

// apenas retorna um nó vazio sem token
TreeNode *vazio() {
return novo_node(NULL, VAZIO);
}

// lista_argumentos "," expressao | expressao | vazio
TreeNode *lista_argumentos() {

TreeNode *lista_argumentos = novo_node(NULL, LISTA_ARGUMENTOS);

// vazio
if(atual()->tokenval == FECHA_PARENTESES){
insere_filho(lista_argumentos, vazio());
return lista_argumentos;
}

Expand Down Expand Up @@ -567,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 @@ -595,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 @@ -661,23 +668,45 @@ TreeNode *acao() {
printf("Err acao: ");
printToken(atual(), 0, 0);
erro(nomeArquivo, atual(), "Token inesperado.");
return acao;
break;
}

return 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 @@ -726,6 +755,7 @@ TreeNode *lista_parametros() {
TreeNode *lista_parametros = novo_node(NULL, LISTA_PARAMETROS);

if(atual()->tokenval == FECHA_PARENTESES){ // pode ser vazio
insere_filho(lista_parametros, vazio());
return lista_parametros;
}

Expand Down Expand Up @@ -775,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
2 changes: 2 additions & 0 deletions tree/tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,8 @@ void printLabel1(TreeNode *node, FILE *treedot){
printArquivo(treedot, "CHAMADA_FUNCAO");
else if (node->bnfval == LISTA_ARGUMENTOS)
printArquivo(treedot, "LISTA_ARGUMENTOS");
else if (node->bnfval == VAZIO)
printArquivo(treedot, "VAZIO");

if(treedot != stdout) // se for diferente do stdout, então printa no arquivo
printArquivo(treedot, "\"];\n"); // finalizando a linha
Expand Down
2 changes: 1 addition & 1 deletion tree/tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ typedef enum { /// tipo dos nós da árvore de acordo com a BNF
DECLARACAO_FUNCAO, CABECALHO, LISTA_PARAMETROS, PARAMETRO, CORPO, ACAO, B_SE, B_REPITA, B_ATRIBUICAO, B_LEIA, B_ESCREVA,
B_RETORNA, EXPRESSAO, EXPRESSAO_LOGICA, EXPRESSAO_SIMPLES, EXPRESSAO_ADITIVA, EXPRESSAO_MULTIPLICATIVA, EXPRESSAO_UNARIA,
OPERADOR_RELACIONAL, OPERADOR_SOMA, OPERADOR_LOGICO, OPERADOR_MULTIPLICACAO, OPERADOR_NEGACAO, FATOR, NUMERO, CHAMADA_FUNCAO,
LISTA_ARGUMENTOS
LISTA_ARGUMENTOS, VAZIO
} EBNFType;

typedef struct TreeNode {
Expand Down

0 comments on commit 8d508a0

Please sign in to comment.