análise sintática ll(1) · 2012. 5. 15. · definição uma gramática g é ll(1) se e somente...

16
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

Upload: others

Post on 14-Feb-2021

1 views

Category:

Documents


0 download

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