análise sintática ll(1) · 2012. 5. 15. · definição uma gramática g é ll(1) se e somente...
TRANSCRIPT
-
Análise Sintática LL(1)
Análise Sintática Descendente
FACULDADE ANGLO AMERICANO – FOZ DO IGUAÇU Curso de Ciência da Computação – 7º Periodo Disciplina: Compiladores Prof. Erinaldo Sanches Nascimento
-
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.
2 http://erinaldosn.wordpress.com
-
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 |
http://erinaldosn.wordpress.com 5
Pilha de análise sintática Entrada Ação 1 $S ( ) $ S ( S ) S 2 $ S) S ( ( ) $ casamento 3 $ S ) S ) $ S 4 $ S ) ) $ casamento 5 $ S $ S 6 $ $ aceita
-
Lista de Ações
S ( S ) S [S ( S ) S] ( ) S [S ] ( ) [S ]
http://erinaldosn.wordpress.com 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 da gramática faça o seguinte:
http://erinaldosn.wordpress.com 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