Escolar Documentos
Profissional Documentos
Cultura Documentos
Anlise Sinttica
Introduo
Introduo
Vantagens:
- Especificao sinttica precisa;
- A criao do analisador pode ser automatizada
por ferramentas especficas, para certas classes
de gramticas;
- Gramticas bem projetadas facilitam a
compilao e a deteco de erros;
- Novas construes sintticas so mais
facilmente adicionadas.
Descendente (Top-Down)
Ascendente (Bottom-Up)
AS Descendente
Exemplo
Seja G(S):
S aBC
B ab
Bb
Cc
e as sentenas:
w1 = aba
w2 = abc
w3 = aabc
Exemplo
Para w1, temos a sequncia de derivaes:
S
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
C
a
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
C
a
Exerccio
AS Ascendente
Exemplo
Seja G(S):
S aBC
B ab
Bb
Cc
e as sentenas:
w1 = aba
w2 = abc
w3 = aabc
Exemplo
Para w1, temos a sequncia de redues:
Exemplo
Para w1, temos a sequncia de redues:
B
a
Exemplo
Para w1, temos a sequncia de redues:
Exemplo
Para w1, temos a sequncia de redues:
S
Exemplo
Para w1, temos a sequncia de redues:
S
a
A raiz foi alcanada
Exerccio
AS Descendente
AS Descendente
Exemplo
Seja G(S):
S aBC
B ab
Bb
Cc
e as sentenas:
w1 = aba
w2 = abc
w3 = aabc
Exemplo
Para w1, temos a sequncia de derivaes:
S
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
a
C
b
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
a
C
b
FALHA
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
C
c
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
C
c
FALHA
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
C
a
Exemplo
Para w1, temos a sequncia de derivaes:
S
a
B
b
C
a
Exerccio
AS Descendente Recursivo
AS Descendente Recursivo
AS Descendente Recursivo
Seja G(Expr):
Expr Termo + Expr | Termo
Termo Fator * Termo | Fator
Fator num_int | ( Expr )
AS Descendente Recursivo
Podemos escrev-la numa forma estendida
+
(EBNF), onde (w) significa uma ou mais
*
AS Descendente Recursivo
A regra 1 interpretada como: "expresso um
termo seguido de zero ou mais expresses
conectadas pelo operador +", ou seja:
Expr = Termo ou
Expr = Termo + Termo ou
Expr = Termo + Termo + Termo
AS Descendente Recursivo
AS Descendente Recursivo
void analisar() {
/* chama o lxico */
lexico.proximoToken();
Expr();
}
AS Descendente Recursivo
void Expr() {
Termo();
while (tokenAtual == '+') {
lexico.proximoToken();
Termo();
}
}
AS Descendente Recursivo
void Termo() {
Fator();
while (tokenAtual == '*') {
lexico.proximoToken();
Fator();
}
}
AS Descendente Recursivo
void Fator() {
if (tokenAtual == num_int) {
/* tratar nmero inteiro... */
lexico.proximoToken();
}
else if (tokenAtual == '(') {
Expr();
if (tokenAtual != ')'){erroSintaxe();}
}
}
Problema da Recursividade
Para que se possa construir um analisador sinttico
descendente, uma gramtica no pode ter regras
recursivas esquerda (diretas ou indiretas). Uma
gramtica recursiva esquerda se tem
produes da forma
A A
Nesse caso, um algoritmo que implemente um
analisador descendente vai entrar em ciclo (loop)
infinito
Problema da Recursividade
Este problema pode ser resolvido com uma
transformao na gramtica. Produes do tipo
AA|
Cujo cujo objetivo produzir cadeias da forma
, , , ...
devem ser transformadas para
A A'
Problema da Recursividade
Exemplo
Exemplo
Expr Termo Expr'
Expr' + Termo Expr' |
Termo Fator Termo'
Termo' * Fator Termo' |
Fator id | num_int | ( E )
Problema do Indeterminismo
Outro problema relacionado aos analisadores
descendentes o de produes da forma
(1) A
(2) A
a partir do ponto A na ADS de uma sentena, podese derivar pela regra (1) ou pela regra (2)
para chegar mesma cadeia ; ou seja, pode-se
aplicar mais de uma regra para chegar ao mesmo
Problema do Indeterminismo
Uma nova transformao necessria. Produes
do tipo
A
A
so fatoradas pelo prefixo comum, gerando
A Aresto
Exemplo
Expr Termo Expr'
Expr' + Termo Expr' |
Termo Fator Termo'
Termo' * Fator Termo' |
Fator id | id [ num_int ]
Exemplo
Expr Termo Expr'
Expr' + Termo Expr' |
Termo Fator Termo'
Termo' * Fator Termo' |
Fator id FatorR | num_int | ( E )
Gramtica LL(1)
A uma gramtica transformada de modo a eliminar
recursividades esquerda e indeterminismos,
chamamos gramtica LL(k) ("Left-to-right, Leftmost-derivation with Lookahead k").
Gramtica LL(1)
A ideia de anlise LL(k) a de que basta
olharmos no mximo k smbolos frente na
sentena, a partir do ponto em que estamos na
ADS, para que possamos decidir que regra de
produo aplicar.
A constante k deve ser to pequena quanto
possvel ( idealmente, k=1; da o nome:
gramtica LL(1) ).
Exemplo
SaS
SbS
Sc
Exemplo
SabS
SacS
S ad
AS Descendente Tabular
Utiliza uma tabela de anlise, com uma estrutura
auxiliar (pilha); implementado atravs de um
autmato de pilha (Push-Down Automaton);
A exemplo do analisador descendente recursivo,
este tambm utiliza gramticas LL(1)
AS Descendente Tabular
Este mtodo de anlise utilizado quando a
linguagem usada para implementar o analisador
no dispe de recursividade, ou quando no se
deseja usar recursividade, por exemplo, para evitar
estouros de pilha.
AS Descendente Tabular
Por utilizar uma pilha explcita (ao invs da pilha
implcita em ativaes recursivas), facilita a
visualizao do funcionamento do analisador,
conforme regras de produo so aplicadas.
Funcionamento do AS Tabular
Modelo do AS Tabular
entrada
Analisador
Sinttico
TAS
<EOF
>
<EOF
>
pilha
sada
1 4 8
Funcionamento do AS Tabular
Funcionamento do AS Tabular
Funcionamento do AS Tabular
Funcionamento do AS Tabular
3) Se X um terminal tokenAtual, o analisador
acusa um erro de sintaxe (ativa rotina de
tratamento de erros);
Funcionamento do AS Tabular
4) Se X um no-terminal, o analisador consulta
TAS[X, tokenAtual]. Se a resposta for uma regra
X 1..n, o analisador desempilha X e empilha
n..1(com 1 no topo da pilha). Para a sada
Algoritmo do AS Tabular
Algoritmo do AS Tabular
while (X != <EOF>) {
if (X.isTerminal) {
if (X == tokenAtual) {
pop(X); lexico.proximoToken();
} else ERRO();
}else
if (TAS[X, tokenAtual] == "X1..n") {
pop(X); push(n..1);
} else ERRO();
} if (tokenAtual != <EOF>) ERRO();
Obteno da TAS
Como visto, a Tabela de Anlise Sinttica o
componente central do analisador tabular.
Para constru-la, precisamos introduzir dois novos
conceitos (ou relaes) em gramticas. So os
conjuntos Primeiro ("First") e Seguidor ("Follow")
Observao
Obteno da TAS
Obteno da TAS
para cada produo A , faa {
para cada terminal a FIRST(), faa
adicione A em TAS[A, a];
se FIRST(), adicione A
em TAS[A, b], para cada b FOLLOW(A);
se FIRST() e FOLLOW(A), adicione A em
TAS[A, <EOF>]
}
indique situao de ERRO para todas as posies
indefinidas de TAS[A, a];
Exemplo
1. Expr Termo Expr'
2. Expr' + Termo Expr'
3. Expr'
4. Termo Fator Termo'
5. Termo' * Fator Termo'
6. Termo'
7. Fator id
Exemplo - FIRST
FIRST(Expr) = {(,id}
FIRST(Expr') = {+,}
FIRST(Termo) = {(,id}
FIRST(Termo') = {*,}
FIRST(Fator) = {(,id}
Exemplo - FOLLOW
FOLLOW(Expr) = {),}
FOLLOW(Expr') = {),}
FOLLOW(Termo) = {+,),}
FOLLOW(Termo') = {+,),}
FOLLOW(Fator) = {+,*,),}
Exemplo - TAS
Exemplo
Analisar a entrada:
a+b*c
Exemplo
Entrada: a + b * c <EOF>
Derivaes:
PilhaExpr
de
Exemplo
Entrada: a + b * c <EOF>
Derivaes: Expr Termo Expr'
Termo
PilhaExpr'
de
Exemplo
Entrada: a + b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo'
Fator
Termo'
PilhaExpr'
de
Exemplo
Entrada: a + b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id
id
Termo'
PilhaExpr'
de
Exemplo
Entrada: + b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id
Termo'
PilhaExpr'
de
Exemplo
Entrada: + b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo'
PilhaExpr'
de
Exemplo
Entrada: + b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr'
+
Termo
PilhaExpr'
de
Exemplo
Entrada: b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr'
Termo
PilhaExpr'
de
Exemplo
Entrada: b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo'
Fator
Termo'
PilhaExpr'
de
Exemplo
Entrada: b * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id
id
Termo'
PilhaExpr'
de
Exemplo
Entrada: * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id
Termo'
PilhaExpr'
de
Exemplo
Entrada: * c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id,
Termo' * Fator Termo'
*
Fator
Termo'
PilhaExpr'
de
Exemplo
Entrada: c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id,
Termo' * Fator Termo'
Fator
Termo'
PilhaExpr'
de
Exemplo
Entrada: c <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id,
Termo' * Fator Termo', Fator id
id
Termo'
PilhaExpr'
de
Exemplo
Entrada: <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id,
Termo' * Fator Termo', Fator id
Termo'
PilhaExpr'
de
Exemplo
Entrada: <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id,
Termo' * Fator Termo', Fator id,
Termo'
PilhaExpr'
de
Exemplo
Entrada: <EOF>
Derivaes: Expr Termo Expr',
Termo Fator Termo', Fator id,
Termo' , Expr' + Termo Expr',
Termo Fator Termo', Fator id,
Termo' * Fator Termo', Fator id,
Termo' , Expr'
Pilha de
Exerccio
a) Montar a Tabela de Anlise Sinttica para a
gramtica da mini-linguagem descrita a seguir (note
que os passos necessrios so:
[1] Reescrever a gramtica na forma LL(1);
[2] Encontrar os conjuntos FIRST e FOLLOW;
[3] Construir a TAS);
Exerccio
Prog ListaCmds end
ListaCmds ( Cmd ; )*
Cmd CmdDecl | CmdAtrib | CmdWrite
CmdDecl Tipo id
Tipo integer | real
CmdAtrib id := Expr
CmdWrite write Expr
Expr Termo ( + Termo | - Termo )*
Exerccio
b) Demonstrar o algoritmo de anlise tabular para o
seguinte programa:
integer x; x := 0;
integer y; y := 1 + x;
write y*2
end
(Isso
possibilita construir uma TAS apenas para as
5. Cond id
produes dadas, a fim de ilustrar o problema)
Bibliografia Recomendada
AHO, A., SETHI, R. e ULLMAN, J. D.
Compiladores: Princpios, Tcnicas e
Ferramentas, LTC, 1995
LOUDEN, KENNETH C. Compiladores: Princpios
e Prctica Thomson, 2004
MONGIOVI, GIUSEPPE. Construo de
Compiladores, Notas de Aula. Joo Pessoa: 2002
NICOLLETTI, PEDRO S. Compiladores, Notas de