Compiladores  
Aula 06 – Construção de Árvores Sintáticas  
Abstratas (Implementação)  
Edirlei Soares de Lima  
<edirlei.lima@universidadeeuropeia.pt>  
Processo de Compilação  
unidades léxicas  
Analisador  
Léxico  
Analisador  
Sintático  
Programa-fonte  
parse trees  
(opcional)  
Gerador de Código  
Intermediário e  
Analisador  
Tabela de Símbolos  
Otimização  
Semântico  
código  
intermediário  
linguagem de máquina  
Programa Objeto  
Gerador de Código  
Análise Sintática  
•
•
Os analisadores sintáticos constroem árvores de análise  
sintática (parse trees) para os programas dados.  
–
Em alguns casos, a parse tree é construída implicitamente (apenas o  
resultado de percorrer a árvore é gerado);  
Objetivos da Análise Sintática:  
–
Verificar o programa de entrada para determinar se ele está  
sintaticamente correto;  
–
Produzir árvores de análise (parse trees).  
Análise Sintática  
•
Saída:  
Token: 25, Lexema: (  
Enter <expr>: 25  
<expr>  
Enter <termo>: 25  
Enter <fator>: 25  
Token: 11, Lexema: soma  
Enter <expr>: 11  
<termo>  
Enter <termo>: 11  
Enter <fator>: 11  
Token: 21, Lexema: +  
Exit <fator>: 11  
<
fator>  
/
)
<
fator>  
Exit <termo>: 21  
Token: 10, Lexema: 47  
Enter <termo>: 10  
Enter <fator>: 10  
Token: 26, Lexema: )  
Exit <fator>: 10  
(
<expr>  
+
total  
<
termo>  
<termo>  
fator>  
Exit <termo>: 26  
Exit <expr>: 11  
Token: 24, Lexema: /  
Exit <fator>: 25  
Token: 11, Lexema: total  
Enter <fator>: 11  
Token: -1, Lexema: EOF  
Exit <fator>: 11  
<
fator>  
<
soma  
47  
Exit <termo>: -1  
Exit <expr>: 25  
Árvore de Sintaxe  
•
•
Após a análise, os detalhes de derivação não são necessários  
para fases subsequentes do processo de compilação.  
O Analisador Semântico remove as produções intermediárias  
para criar uma árvore sintática abstrata (abstract syntax tree).  
expr  
expr  
term  
Parse Tree:  
Abstract Syntax Tree:  
X
factor  
X
Árvore Sintática Abstrata  
Árvore Sintática:  
<
prog>  
|
<
atrib>  
|
/
\
Árvore Sintática Abstrata:  
result = <expr>  
|
=
/ \  
result +  
<
termo>  
|
result = (soma + 47)  
<
/
fator>  
| \  
/
\
soma 47  
(
<expr> )  
| \  
termo> + <termo>  
/
<
|
fator>  
|
|
<fator>  
|
<
soma  
47  
Árvore Sintática Abstrata  
•
Para transformar uma árvore sintática em uma árvore sintática  
abstrata, é necessário:  
1
2
3
. Remover nós que possuem um único filho. A árvore sintática  
abstrata nunca contêm sequencias de nós com apenas um filho;  
. Remover detalhes sintáticos (como parênteses, virgula, e ponto e  
virgula);  
. Os operadores (como +, -, x, e /) devem ser transformados em nós  
internos na árvore abstrata.  
Construção da Árvore Sintática  
Abstrata (Implementação)  
Node* CSTtoAST(Node *current)  
{
int i = 0;  
int x = 0;  
if (current == NULL)  
return NULL;  
while (current->children[i] != NULL)  
{
current->children[i] = CSTtoAST(current->children[i]);  
i++;  
}
.
..  
if (i == 1)  
{
if (current->type == -1)  
{
Node* node = current->children[0];  
free(current);  
return node;  
}
}
.
..  
Construção da Árvore Sintática  
Abstrata (Implementação)  
Entrada:  
•
int test;  
test = (45 + 100)/2;  
Leitura Complementar  
•
•
Aho, A. V., Lam, M. S., Jeffrey, R. S.  
Compiladores: Princípios, Técnicas e  
Ferramentas. 2ª edição, Pearson, 2007.  
ISBN: 978-8588639249.  
–
Capítulo 3: Lexical Analysis  
–
Capítulo 4: Syntax Analysis  
Sebesta, R. W. Conceitos de Linguagens de  
Programação. 9ª edição Editora Bookman,  
2
011. ISBN: 978-8577807918.  
Capítulo 3: Descrevendo a Sintaxe e a Semântica  
Capítulo 4: Análise Léxica e Sintática  
–
–