Análise Sintática LL(1) - Profº Erinaldo Sanches Nascimento

Propaganda
FACULDADE ANGLO AMERICANO – FOZ DO IGUAÇU
Curso de Ciência da Computação – 7º Periodo
Disciplina: Compiladores
Prof. Erinaldo Sanches Nascimento
Análise Sintática LL(1)
Análise Sintática Descendente
Introdução
Os analisadores sintáticos preditivos podem ser
construídos para uma classe de gramática
chamada LL(1).
– L (Left-to-right) significa que a cadeia de entrada é
escandida da esquerda para a direita.
– L (Leftmost) representa uma derivação mais à
esquerda
– 1 pelo uso de um símbolo à frente na entrada
utilizando um cada passo para tomar as decisões
quanto à ação de análise.
http://erinaldosn.wordpress.com
2
Definição
Uma gramática G é LL(1) se e somente se, sempre que A
 | forem duas produções distintas de G, as
seguintes condições forem verdadeiras:
1. Para um terminal a, tanto quanto não derivam
cadeias començando com a.
2. No máximo um dos dois, ou , pode derivar a
cadeia vazia.
3. Se
* , então não deriva nenhuma cadeia
começando com um terminal em FOLLOW(A). De
modo semelhante se
* , então não deriva
qualquer cadeia começando com um terminal
FOLLOW(A).
http://erinaldosn.wordpress.com
3
Método Básico
• Utiliza uma pilha explícita
– Facilita e agiliza a visualização as ações do
analisador sintático LL(1)
http://erinaldosn.wordpress.com
4
Exemplo
• Gramática que gera cadeias de parênteses
balanceados:
S(S)S|
Pilha de análise sintática
1
$S
2
$ S) S (
3
$S)S
4
$S)
5
$S
6
$
Entrada
()$
()$
)$
)$
$
$
http://erinaldosn.wordpress.com
Ação
S (S)S
casamento
S
casamento
S
aceita
5
Lista de Ações
S
(S)S
()S
()
[S
[S
[S
http://erinaldosn.wordpress.com
( S ) S]
]
]
6
Tabela
• Quatro colunas:
1) Enumera os passos.
2) Mostra o conteúdo da pilha de análise sintática.
•
•
O final da pilha à esquerda.
O topo da pilha à direita.
3) Mostra a entrada da esquerda para a direita.
4) Apresenta uma descrição resumida da ação.
http://erinaldosn.wordpress.com
7
Analisador Descendente
• Coloca o símbolo de início na pilha.
– Substitui um não-terminal no topo da pilha por uma
de suas escolhas na regra gramatical
a) Substituir um não-terminal A no topo da pilha por
uma cadeia
com base na escolha da regra
gramatica A
;
b) Casar uma marca no topo da pilha com a marca de
entrada seguinte
• Aceita uma cadeia de entrada se, após uma série
de ações, a pilha e a entrada ficarem vazias.
http://erinaldosn.wordpress.com
8
Árvore de Análise Sintática
• Construir nós à medida que cada terminal ou
não-terminal é colocado na pilha.
• O nó-raiz é construído no começo da análise
sintática.
• Os nós de cada um dos símbolos de substituição
são construidos à medida que os símbolo são
colocados na pilha e são concatenados como
filhos do nó de S que eles substituem na pilha.
Modifique a pilha de forma a conter apontadores
para os nós construidos, em vez de conter só os
terminais e não-terminais.
http://erinaldosn.wordpress.com
9
Tabela de Reconhecimento
Sintático Preditivo
• M[A, a], um arranjo bidimensional
– A é um não-terminal
– a é um terminal ou símbolo $ (marcador de fim de
entrada)
• Entrada: gramática G.
• Saída: tabela de análise M.
• Método: para cada produção A
gramática faça o seguinte:
http://erinaldosn.wordpress.com
da
10
Algoritmo
1. Para cada terminal a em FIRST(A), inclua A
em M[A, a].
2. Se pertence a FIRST( ), inclua A
em M[A,b]
para cada terminal b em FOLLOW(A). Se
pertence a FIRST( ) e $ pertence a FOLLOW(A),
acrescente também A
em M[A,$].
Se, depois de realizar esses passos, não houver
produção alguma em M[A, a], então defina M[A, a]
como error.
http://erinaldosn.wordpress.com
11
Complemento do Algoritmo
• Uma gramática é LL(1) se a tabela de análise
sintática LL(1) associada tiver no máximo uma
produção em cada célula.
• Uma gramática LL(1) não pode ser ambigua
http://erinaldosn.wordpress.com
12
Exercício 1
Considere a gramática simplificada de declarações
if:
declaracao
if-decl | outra
if-decl if (exp) | declaracao else-parte
else-parte else declaracao |
exp 0 | 1
Dada a cadeia
if (0) if (1) outra else outra
• Representa a tabela que mostre as ações do
algortimo de análise sintática LL(1).
http://erinaldosn.wordpress.com
13
Exercício 2
Considere a gramática de expressões reduzidas:
E n E’
E’ + n E’ |
Efetue a computação do valor da expressão
3+4+5 mostrando as ações do analisador
sintático na tabela.
http://erinaldosn.wordpress.com
14
Exercício 3
• Utilize uma pilha S para executar a verificaçao de
grupos de parênteses em expressões aritméticas
com uma varredura simples da esquerda para
direita.
• Cada vez que se encontra uma símbolo de
abertura insere-se o símbolo na pilha e cada vez
que se encontra uma símbolo de fechamento
retira-se o símbolo do topo da pilha S
(assumindo-se que a pilha não está vazia).
• Se a pilha estiver vazia após ter sido processada
toda a sequência, então os símbolos em X casam.
http://erinaldosn.wordpress.com
15
http://erinaldosn.wordpress.com
16
Download