Instituto Federal de Santa Catarina Campus Lages
Análise Sintática
Curso: Ciência da Computação Disciplina: Compiladores
Prof. Wilson Castello Branco Neto
Análise Sintática
● Leitura recomendada:
AHO, A.; SETHI, R.; ULMAN, J. D. Compiladores:
princípios, técnicas e ferramentas. 2. ed. Rio de Janeiro: Pearson Prentice Hall, 2008. Capítulo 4 (4.4)
● Leitura complementar:
COOPER, K. D.; TORCZON, L.; Construindo Compiladores. Rio de Janeiro: Elsevier, 2013.
Capítulo 3 (3.3).
Análise Sintática
● Objetivos de aprendizagem:
– Diferenciar análise sintática descendente e ascendente;
– Utilizar as funções FIRST e
FOLLOW para criar tabelas de análise;
– Analisar códigos usando a análise sintática preditiva.
Análise Sintática
● O analisador sintático recebe a lista de tokens do analisador léxico e verifica se esta cadeia pertence a linguagem
gerada pela gramática.
● A ordem de construção da árvore de derivação pode ser da raiz para as folhas (análise descendente) ou vice versa (análise ascendente).
● O tipo de gramática que pode ser usada em cada um dos casos é diferente.
Análise Sintática
● Análise sintática descendente:
– Sentido: raiz para as folhas;
– Tipo de busca: profundidade;
– Ordem de análise: pré-ordem;
– Produz uma derivação mais a esquerda.
Análise Sintática
● Dada a gramática a seguir, monte a arvore de derivação para o seguinte comando: id + id * id
Análise Sintática
Análise Sintática
● Problema: qual produção usar para derivar um determinado não terminal.
● Principais algoritmos:
– Análise sintática de descida recursiva;
– Análise sintática preditiva.
Análise Sintática
● Análise de descida recursiva
– Testa diferentes produções para derivar um não terminal;
– Realiza retrocesso quando uma produção não reconhece uma determinada cadeia;
– Não é necessário na análise de linguagens de programação e pouco usado em outras aplicações.
Análise Sintática
Análise Sintática
● Este procedimento precisa ser repetido e o erro só indica que uma nova produção deve ser tentada (retrocesso).
Análise Sintática
● Dada a gramática a seguir, monte a arvore de derivação usando a
análise de descida recursiva para o seguinte comando: id + id
Análise Sintática
● FIRST -Função que determina o
conjunto de símbolos terminais que
iniciam as cadeias derivadas de um não terminal.
Análise Sintática
● Calcule FIRST dos símbolos não terminais da gramática abaixo.
● Se ε for incluído como derivação de F, o resultado será o mesmo?
Análise Sintática
● FOLLOW -Função que determina o conjunto de símbolos terminais que podem aparecer imediatamente à direita de um não terminal.
Análise Sintática
● Calcule FOLLOW dos símbolos não terminais da gramática abaixo.
Análise Sintática
● Gramáticas LL(1)
– L – Entrada escaneada da esquerda para a direita;
– L – Derivação mais a esquerda da árvore;
– 1 – Um símbolo a frente é analisado para determinar a produção que deve ser usada para derivar um não terminal.
● Gramáticas LL(1) não podem possuir ambiguidades, recursão à esquerda e devem ser fatoradas à esquerda.
Análise Sintática
Análise Sintática
● Analisador preditivo sem recursão
– Usa uma pilha para simular a derivação mais à esquerda;
– Possui um buffer de entrada com a cadeia a ser reconhecida (lista de tokens);
– Utiliza a tabela de análise para determinar a produção a ser utilizada para cada não terminal, de acordo com o próximo símbolo no buffer de entrada.
Análise Sintática
Análise Sintática
Análise Sintática
● Usando a gramática a seguir realize a análise preditiva dos seguintes
comandos:
– id + id * id
– (id + id * id
Análise Sintática
● Recuperação de erros em um analisador preditivo
– Quando o símbolo na entrada difere do terminal no topo da pilha;
– Quando a entrada na tabela para o
símbolo na entrada e o não terminal no topo da pilha leva a um erro.
Análise Sintática
● Modo pânico – caracteres de sincronização
– Incluir Follow(A) como caracteres de sincronização do não terminal A;
– Símbolos que iniciam construções de nível superior (comando) como caractere de
sincronização das construções de nível inferior (expressão) – Problema do “;”
– Usar a produção ε como default para adiar o erro;
– Desempilhar o terminal que não casa com a entrada e emitir mensagem de erro.
Análise Sintática
Análise Sintática
● Recuperação em nível de frase
– Preenche as entradas em branco da tabela do analisador com chamadas a rotinas de erros que inserem, excluem ou substituem símbolos na cadeia de entrada e emitem as mensagens de erro.
Análise Sintática
● Objetivos de aprendizagem:
– Diferenciar análise sintática descendente e ascendente;
– Utilizar as funções FIRST e
FOLLOW para criar tabelas de análise;
– Analisar códigos usando a análise sintática preditiva.