Você está na página 1de 30

UFRB-CETEC

Curso: Eng. De Computação


Disciplina: Compiladores
Semestre: 2021.1
FREDERICO JÚNIOR GOMES DA SILVEIRA
Análise sintática

 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

 Também chamada de parser


 Símbolos >>> Unidades Sintáticas
 Exemplo:
A + B Expressão

 Expressões agrupadas = comandos/outras unidades


 Saída: árvore sintática do programa
 Utilização de Gramática Livre de Contexto p/ reconhecer um parser
Regras Sintáticas

 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

position expressão + expressão

identificador expressão * expressão

initial identificador número

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

 Espera-se que A.S.


relate quaisquer
erros de sintaxe;
 Deve se recuperar
dos erros mais
comuns;
 P/ continuar
processando a
entrada.
Figura 1. Posição de um analisador sintático num modelo de compilador.
Tratamentos dos Erros de Sintaxe

 (se) Compilador só processar programas corretos:


 projeto e implementação simples

 Programadores escrevem programas com erros

 Bom compilador auxilia o programador

 Geralmente Ling de Prog não descreve como um compilador


deveria responder aos erros
Tratamentos dos Erros de Sintaxe

Programas podem conter erros em muitos níveis diferentes:


LÉXICOS – como errar a grafia de um identificador, palavra-chave ou
operador;

SINTÁTICOS – como uma expressão aritmética com parênteses não-


balanceados;

SEMÂNTICOS – como um operador aplicado a um operando


incompatível;

LÓGICOS – uma chamada infinitamente recursiva.


Tratamentos dos Erros de Sintaxe

 Detecção/recuperação de erros: fase de análise sintática.


 os erros ou são sintáticos por natureza; ou
 são expostos quando o fluxo de tokens do analisador léxico
desobedece às regras gramaticais
 modernos métodos de análise sintática: detectam eficientemente a
presença de erros sintáticos num programa.
 Detectar presença de erros semânticos/lógicos é uma tarefa muito
mais difícil
Tratamentos dos Erros de Sintaxe

Metas do Tratador de Erros num analisador sintático:


Deve relatar a presença de erros clara e acuradamente;

Deve se recuperar de cada erro suficientemente rápido a fim de ser


capaz de detectar erros subsequentes;

Não deve retardar significativamente o processo de programas


corretos.

 Felizmente, os erros comuns são simples basta um mecanismo de


tratamento de erros relativamente direto.
Tratamentos dos Erros de Sintaxe

 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.

 Geralmente esses métodos são muito custosos de implementar, em


termos de tempo e espaço.
Gramáticas Livres de Contexto

 Ling de prog possuem estrutura inerentemente recursiva que pode


ser identificada por gramáticas livre de contexto.
 Por exemplo, poderíamos ter um enunciado condicional definido
por uma regra tal como: se S1 e S2 são enunciados e E é uma
expressão, então:
“if E then S1 else S2“ é um enunciado. (A)

 Gramática livre de contexto (ou Gramática para simplificar)


consiste em terminais, não-terminais, um símbolo de partida e
produções.
Gramáticas Livres de Contexto
TERMINAIS NÃO-TERMINAIS SÍMBOLO DE PRODUÇÕES
PARTIDA

• Símbolos básicos a • variáveis sintáticas • Numa gramática, • Especificam a


partir dos quais as que denotam um não-terminal forma pela qual
cadeias são cadeias caracteres é distinguido os terminais e
formadas; como o símbolo não-terminais
• definem conjuntos de partida. podem ser
• “token” = “terminal” de cadeias combinados

• Em (A), cada uma • auxiliam a • Um não-terminal,


das palavras-chave definição da seguido por uma
if, then e else é um linguagem gerada seta (“ ::= ”),
terminal pela gramática. seguido por uma
cadeia de não-
terminais e
terminais.
Gramáticas Livres de Contexto

 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

 Métodos Universais de Análise Sintática


 Algoritmos de Cocke-Younger-Kasami e o de Earley
 Métodos ineficientes

 Analisador Sintático top-down


 Constrói árvore do topo (raiz) para o fundo (folhas)
 Analisador Sintático bottom-up
 Começam pelas folhas e trabalham árvore acima até a raiz
 São os dois mais utilizados
 Em ambos os casos, entrada varrida da ESQ p/ DIR, um símbolo por
vez
Tipos de Analisador Sintático

 Top-down e bottom-up trabalham apenas com determinadas


subclasses de gramáticas
 Várias subclasses (LL e LR por exemplo) descrevem a maioria das
construções sintáticas
 Gramáticas LL: Analisadores implementados manualmente
 Gramásticas LR: construídos através de ferramentas automatizadas.
Ferramenta Jflex

 Gerador de analise lexical (também conhecido como gerador de


scanner) para Java;
 Desenvolvido por Gerwin Klein na Universidade de Princeton;
 Serve para criar uma classe Java que faz a analise léxica de
qualquer arquivo texto;
 Reconhecimento das linguagens por meio de tabelas de transição
de automatos determinísticos e de expressões regulares.
Ferramenta Jflex

Exemplo da classe Lexer, a qual define os Tokens


para a análise.
Ferramenta Jflex

Analisador léxico - JFlex


Ferramenta GALS

 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

Analisador Léxico em GALS


Obrigado!
fredsilveira13@ufrb.edu.br

Você também pode gostar