Skip to content

Commit

Permalink
Merge pull request #14 from DanielVenturini/análise_semantica
Browse files Browse the repository at this point in the history
Análise semantica - simplificação de todas as regras pronta: árvore podada.
  • Loading branch information
DanielVenturini authored Nov 7, 2018
2 parents 580dc23 + c133f8e commit cdc6601
Show file tree
Hide file tree
Showing 7 changed files with 580 additions and 7 deletions.
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@ A flag ```-ax``` ou ```--ast-x``` gera a saída da árvore de análise sintátic

![Alt Text](https://github.com/danielventurini/vcc/raw/master/syntactic/ast-x.jpeg)

Já a flag ```-at``` ou ```--ast-t``` gera a saída da árvore de anaĺise sintática utilizando o terminal. Este modelo é similar ao útilizado pelo ```Windows``` para printar a árvore de diretórios. Usando a flag para o arquivo de entrada ```exemplos/hashtabel.tpp```, o ```vcc``` gera a seguinte saída no terminal:
Já a flag ```-at``` ou ```--ast-t``` gera a saída da árvore de anaĺise sintática utilizando o terminal. Este modelo é similar ao útilizado pelo ```Windows``` para printar a árvore de diretórios. Usando a flag para o arquivo de entrada ```exemplos/hashtable.tpp```, o ```vcc``` gera a seguinte saída no terminal:

![Alt Text](https://github.com/danielventurini/vcc/raw/master/syntactic/ast-t.jpeg)
![Alt Text](https://github.com/danielventurini/vcc/raw/master/syntactic/ast-t.jpeg)

#### Árvore Sintática
Diferente da árvore de análise sintática, a Árvore Sintática é a simplificação da AST. Os nós intermediários que eram usados para análise sintática são removidos, assim, deixando a árvore mais simples e de fácil visualização. Esta não segue um padrão formal para simplificação, apenas foi escolhido os nós que seriam removidos.

Para gerar a saída da árvore sintática, use as flags: ```--st-x``` e ```--st-t```.

A flag ```-sx``` ou ```--st-x``` gera a saída da árvore sintática. Esta árvore é gerada utilizando o software ```xdot```, que é instalado junto com o ```vcc```. Usando esta flag para o mesmo arquivo de entrada, ```exemplos/teste.tpp```, o ```vcc``` gera a seguinte saída:

![Alt Text](https://github.com/danielventurini/vcc/raw/master/semantic/st-x.jpeg)

Já a flag ```-st``` ou ```--st-t``` gera a saída da árvore sintática utilizando o terminal de maneira semelhante ao da AST.
15 changes: 13 additions & 2 deletions main.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include "lexical/varredura.h"
#include "syntactic/parse.h"
#include "tree/tree.h"
#include "semantic/poda.h"
#include <string.h>

typedef TokenRecord TR; // apenas para economizar espaços na linha
Expand Down Expand Up @@ -81,8 +82,8 @@ void printHelp() {
printf("\u2502 -tk, --tokens, exibe os tokens----------------------------------------\u2502\n");
printf("\u2502 -ax, --ast-x, exibe as árvores de análises sintáticas no xdot--------\u2502\n");
printf("\u2502 -at, --ast-t, exibe as árvores de análises sintáticas no terminal----\u2502\n");
//printf("\u2502 -sx, --st-x, exibe as árvores sintáticas no xdot--------------------\u2502\n");
//printf("\u2502 -st, --st-t, exibe as árvores sintáticas no terminal----------------\u2502\n");
printf("\u2502 -sx, --st-x, exibe as árvores sintáticas no xdot--------------------\u2502\n");
printf("\u2502 -st, --st-t, exibe as árvores sintáticas no terminal----------------\u2502\n");
//printf("\u2502 -ts, --tab-s, exibe a tabela de símbolos-----------------------------\u2502\n");

desenhaLinha(2);
Expand Down Expand Up @@ -136,6 +137,16 @@ int main(int argc, char *argv[]) {
if(flags[2])
printArvoreT(ast);

/*******************\
* análise semântica *
\*******************/
TreeNode *st = podar(ast); // podar a árvore

if(flags[3])
printArvoreX(st, arquivos[i], 1); // 0 indica que a árvore é da análise semântica
if(flags[4])
printArvoreT(st);

i ++;
}

Expand Down
12 changes: 9 additions & 3 deletions makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
all: main # compila todos os arquivos
install: main clean move xdot highlight # instala o vcc

main: varredura parse # parse já inclui a árvore
gcc main.c lexical/varredura.o tree/tree.o syntactic/parse.o desacerto.o tree/stack.o -o vcc
main: varredura parse semantic # parse já inclui a árvore
gcc main.c lexical/varredura.o tree/tree.o syntactic/parse.o desacerto.o tree/stack.o semantic/poda.c -o vcc
#make clean

varredura:
Expand All @@ -20,6 +20,12 @@ desacerto:
pilha: # a pilha é usado somente na árvore
gcc -c tree/stack.c -o tree/stack.o

semantic: poda
# none

poda:
gcc -c semantic/poda.c -o semantic/poda.o

clean: # apaga os arquivos objetos de compilação
rm lexical/varredura.o -f
rm tree/tree.o -f
Expand All @@ -28,7 +34,7 @@ clean: # apaga os arquivos objetos de compilação
rm tree/pilha.o -f

xdot: # instala o xdot
apt-get install xdot --allow-unauthenticated
apt-get install xdot --allow-unauthenticated -y

move: # move o executavel para a pasta /bin/
mv vcc /usr/bin/
Expand Down
24 changes: 24 additions & 0 deletions semantic/ebnf.poda
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{EBNF simplificada para a árvore podada. Todos os nós intermediários não necessários são removidos}
{uma mistura da EBNF com REGEX para padronizar a árvore podada}
{Não condiz com uma representação formal; apenas para me organizar melhor}

programa -> declaracao_variaveis | inicializacao_variaveis | declaracao_funcao {aqui há recursão em programa}
declaracao_variaveis -> [INTEIRO | FLUTUANTE] lista_variaveis
{inicializacao_variaveis -> ID expressao ==> substitui pela atribuição}
ID -> ID [] {quando houver indice}
lista_variaveis -> lista_variaveis ID | ID
declaracao_funcao -> [INTEIRO | FLUTUANTE] ID lista_parametros corpo
{cabecalho ==> foi removido e os nós inseridos em declaracao_funcao}
lista_parametros -> lista_parametro parametro | parametro
parametro -> [INTEIRO] ID {não necessáriamente há o indice do ID []}
corpo -> expressao | declaracao_variaveis | se | repita| leia| escreva | retorna {aqui também há recursão}
se -> expressao corpoSE | expressao corpoSE corpoSENAO {corpo é normal, apenas para diferenciar}
repita -> corpo expressao
leia -> ID
escreva -> expressao
retorna -> expressao
chamada_funcao -> ID lista_argumentos
lista_argumentos -> lista_argumento expressao | expressao
atribuicao -> ID expressao
{expressao_ ==> não há mais expressão; todos os nós intermediários foram simplificados}
expressao_unaria -> operador_[soma|negacao] fator {não necessáriamente um fator, mas não pensei em nada melhor}
Loading

0 comments on commit cdc6601

Please sign in to comment.