Estratégias de Análise Sintática Top-Down e LL(1)

Classificado em Artes e Humanidades

Escrito em em português com um tamanho de 2,4 KB

Estratégia de Desenvolvimento: Top-Down (Descendente)

Objetivo: Encontrar uma derivação mais à esquerda para uma cadeia de entrada, construindo a árvore gramatical a partir da raiz, criando os nós em pré-ordem (busca em profundidade).

Implementação

  • Consiste em um conjunto de procedimentos, um para cada não-terminal da gramática;
  • A execução começa com a ativação do procedimento referente ao símbolo inicial;
  • O procedimento retorna sucesso se toda a cadeia de entrada puder ser derivada;
  • As produções são escolhidas de modo arbitrário.

Problemas

  • Uma gramática recursiva à esquerda pode levar o analisador a um laço infinito;
  • O retrocesso (backtracking) causa repetição na leitura da entrada, custando tempo e dificultando a identificação de erros.

Solução

  • Tratar a gramática para que identifique univocamente qual produção deve ser expandida.

Gramáticas LL(1)

São gramáticas cuja tabela sintática não possui entradas múltiplas. Elas não são ambíguas nem recursivas à esquerda.

Analisador Sintático Preditivo LL(1)

  • Ideia: Evitar o retrocesso fazendo com que o token identifique exatamente qual produção aplicar na expansão de um não-terminal;
  • O autômato de pilha é controlado por uma tabela de análise;
  • Utiliza lookahead (1 símbolo) através das funções First e Follow;
  • Requisitos:
    • A gramática não deve ser recursiva à esquerda;
    • Deve ser fatorada à esquerda;
    • Não-terminais com múltiplas produções devem ter os primeiros terminais deriváveis identificados univocamente.

Funções First e Follow

Funções que auxiliam na construção de analisadores sintáticos descendentes e ascendentes. O objetivo é inferir, a partir da estrutura gramatical, a relação entre símbolos terminais e não-terminais.

  • FIRST: Conjunto de símbolos terminais que iniciam uma forma sentencial. Define quando qualquer produção pode ser usada.
  • FOLLOW: Conjunto de símbolos terminais que podem aparecer após um símbolo não-terminal em alguma forma sentencial. Define quando uma produção do tipo A ::= ε deve ser usada.

Entradas relacionadas: