Escolar Documentos
Profissional Documentos
Cultura Documentos
Aula 3 - Análise Sintática Parte 1
Aula 3 - Análise Sintática Parte 1
Roteiro de Apresentação
Regras Sintáticas
Papel do Analisador Sintático
Tratamentos dos erros de sintaxe
Estratégias de recuperação de erros
Gramáticas Livres de Contexto
Tipos de Analisador Sintático
Ferramenta Jflex – trabalho final
Ferramenta GALS – trabalho final
Referências Bibliográficas
Análise Sintática
Regras Sintáticas
Qualquer identificador = expressão
Qualquer número = expressão
Se expressão1 e expressão2 são expressões, então:
expressão1 + expressão2
são expressões
expressão1 * expressão2
Se identificador1 é um identificador e expressão2 é uma expressão, então:
identificador1= expressão2 é um comando (statement)
Se expressão1 é uma expressão e statement2 é um comando (statement), então;
while( expressão1) { statement2 }
são comandos (statements)
if( expressão1) { statement2 }
Regras Sintáticas
Exemplo:
position = initial + rate * 60
comando de atribuição
identificador = expressão
rate 60
Papel do Analisador Sintático
1. Analisador Sintático obtém cadeia de tokens (analisador léxico)
2. Verifica se a cadeia pode ser gerada pela gramática
Exemplo
Estratégias de Recuperação de
Erros
Estratégias gerais que um analisador sintático emprega para se recuperar de
um erro sintático
Modalidade do desespero
Nível de frase
Produções de erro
Correção global
Estratégias de Recuperação de
Erros
MODALIDADE DO DESESPERO
método mais simples de implementar
usado pela maioria dos métodos de análise sintática
“Funcionamento”:
1. Ao descobrir um erro, o analisador sintático descarta símbolos de entrada
(um de cada vez);
2. Até encontrar um token pertencente a um conjunto designado de tokens
de sincronização.
3. Esses tokens são usualmente delimitadores, tais como o ponto-e-vírgula ou o
end, cujo papel no programa-fonte seja claro
Apesar de pular uma parte considerável da entrada, possui a
vantagem da simplicidade.
Erros múltiplos raros: método pode ser razoavelmente adequado.
Estratégias de Recuperação de
Erros
RECUPERAÇÃO DE FRASES
“Funcionamento”:
1. Ao descobrir um erro, o analisador sintático pode realizar uma correção
local na entrada restante.
2. Pode substituir um prefixo de entrada por alguma cadeia que permita ao
analisador seguir em frente.
3. Correções locais típicas seriam substituir uma vírgula por um ponto-e-vírgula,
remover um ponto-e-vírgula estranho ou inserir um ausente.
ATENÇÃO: substituições que não levem a laços infinitos!
Exemplo: Inserir para sempre na entrada algo à frente do seu símbolo
corrente.
Pode corrigir qualquer cadeia e tem sido usado em vários
compiladores de correção de erros.
Desvantagem: lidar com o erro efetivo que ocorreu antes do ponto de
detecção
Estratégias de Recuperação de
Erros
PRODUÇÕES DE ERRO
Ideia dos erros comuns “encontrados”: aumentaríamos a gramática
para a linguagem em exame com as produções que gerassem
construções ilegais.
Gramática aumentada com essas produções de erro para construir um
analisador sintático.
Se uma produção de erro for usada pelo analisador, podemos gerar
diagnósticos apropriados para indicar a construção ilegal que foi
reconhecida na entrada.
Estratégias de Recuperação de
Erros
CORREÇÃO GLOBAL
Existem algoritmos p/ escolher uma seqüência mínima de mudanças
Para obter uma correção global de um menor custo.
Dadas uma cadeia de entrada incorreta x e uma gramática G:
Esses algoritmos irão encontrar uma árvore gramatical para uma cadeia
relacionada y;
De forma que inserções/remoções/mudanças de tokens para transformar x
em y sejam tão pequenas quanto possível.
Exemplo
Gramáticas Livres de Contexto
DESCRIÇÃO FORMAL
A definição formal de uma gramática livre de contexto pode ser
representada através dos seguintes componentes:
G = (N, T, P, S)
Onde:
N – Conjunto finito de símbolos não terminais.
T – Conjunto finito de símbolos terminais.
P – Conjunto de regras de produções.
S – Símbolo inicial da gramática.
Gramáticas Livres de Contexto
CONVENÇÕES NOTACIONAIS
Para evitar especificações do tipo “esses são terminais” e “esse são
não-terminais”, vamos utilizar algumas convenções:
Símbolos terminais: Símbolos não-terminais:
1. Letras minúsculas do inicio do 1. Letras maiúsculas do início do
alfabeto (a, b, c) alfabeto (A, B, C)
2. Símbolos de operadores (+, -, 2. A letra S, que, quando aparece,
etc.) é usualmente o símbolo de
3. Símbolos de pontuação partida
(“parênteses”, “vírgula”, etc) 3. Os nomes em itálico formados
4. Os dígitos 0, 1, 2, ..., 9 por letras minúsculas, como
5. Cadeias em negrito como “id” expr ou cmd.
e “if”
As letras maiúsculas do final do As letras minúsculas do final do
alfabeto, tais como X, Y, Z, alfabeto, principalmente u, v, ..., z,
representam símbolos gramaticais, representam cadeias de terminais.
isto é, terminais ou não-terminais
Tipos de Analisador Sintático
Gerador de compiladores
Utilizado para a geração automática de analisadores léxicos e
sintáticos
Desenvolvido em Java, versão 1.4
Pode ser usado em ambientes no qual haja uma máquina virtual
Java
Analisadores são gerados através de especificações léxicas
baseadas em expressões regulares e sintáticas baseadas na GLC
Ferramenta GALS
Configuração do GALS
Ferramenta GALS