5.5 – Análise Bottom-Up Tentativa de construir uma árvore sintática para a sentença analisada, começando das folhas, indo em direção à raiz (pós-ordem.

Slides:



Advertisements
Apresentações semelhantes
FAPE - Curso de Ciência da Computação
Advertisements

Software Básico Silvio Fernandes
Marco Antonio Montebello Júnior
Árvores de Decisão Tabelas de Decisão Aplicações Informáticas
III – Análise sintáctica
III – Análise sintáctica
III – Análise sintáctica
III – Análise sintáctica Parsers ascendentes Instruções shift-reduce Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.5 LFA 1999/ Jorge.
III – Análise sintáctica
Universidade Federal de Campina Grande – UFCG Centro de Engenharia Elétrica e Informática – CEEI Departamento de Sistemas e Computação – DSC Máquina de.
Teoria da Computação FIC– Ciência da Computação
Compiladores FIC– Ciência da Computação Professor: Ciro Meneses Santos
Deyvisson, Rafael M.P., Renato, Robson C.F., Rodolfo
Análise Sintática Ascendente ­
Estrutura de Dados e Algoritmos e Programação e Computadores II
Profa. Heloise Manica Paris Teixeira
Análise Sintática - Continuação
Linguagens Livres de Contexto
esquerda p/ direita,read only
Análise Dada uma cadeia de terminais w, queremos saber se wL(G) ou não. Se for o caso, poderemos querer achar uma derivação de w. Um algoritmo que pode.
Identificando Linguagens Não Regulares
Aplicações de Pilhas Pilhas são fundamentais em diversas áreas da computação: Sistemas Operacionais Arquitetura de Computadores Compiladores Entre outros.
YACC.
Análise Sintática Ascendente
Relações em uma Gramática
Análise Léxica Supondo o trecho de programa abaixo:
Universidade Federal da Paraíba Departamento de Informática Construção de Compiladores Verificação de Tipos.
Construção de Compiladores
Construção de Compiladores
Construção de Compiladores
5.6 – Complementos de Yacc – Usando Yacc com gramáticas ambíguas
Buscas em Grafos Prof. André Renato 1º Semestre/2012
Denis Pinheiro Teoria de Linguagens Prof. Newton José Vieira
Análise léxica e sintática
Informática Teórica Engenharia da Computação
Ferramentas para a Construção de Compiladores: Lex & Yacc
Determinar o tipo de gramática
Compiladores, Aula Nº 19 João M. P. Cardoso
Compiladores, Aula Nº 9 João M. P. Cardoso
Gramáticas Livres de Contexto
Erick Vagner Cabral Igor Lucena Vitor Baptista
Aula 17 1 Análise Sintáctica Compiladores, Aula Nº 17 João M. P. Cardoso.
Análises léxica e sintática
Análise Léxica e Sintática
Aulão de Linguagens Formais e Compiladores
Capítulo II Gramáticas e Linguagens
Analise sintática aula-07-analise-sintática.pdf.
Esquemas L-atribuídos
Análise Sintática LR Prof. Alexandre Monteiro
Análises léxica e sintática
Projeto de Tradutor Preditivo. Introdução Introdução Esquemas L-atribuidos são reconhecidos por analisadores Top-Down. Entre estes analisadores, se encontra.
Aula 12 1 Análise Sintáctica Compiladores, Aula Nº 12 João M. P. Cardoso.
Compiladores.
Análise Sintática Prof. Alexandre Monteiro
Tradução Dirigida por Sintaxe
PUCC 1 Tópicos em Sistemas Inteligentes. PUCC 2 Agenda - Aula 03 Buscas Agentes que Planejam.
CES-41 COMPILADORES Aulas Práticas Capítulo II A Ferramenta Yacc.
Aula 18 1 Análise Sintáctica Compiladores, Aula Nº 18 João M. P. Cardoso.
Linguagens Livres de Contexto
Faculdade Pernambucana - FAPE Setembro/2007
COMPILADORES 04 Prof. Marcos.
Uma Infraestrutura para a
Sintaxe de uma Linguagem
tópicostópicos itens 01. Terminologia 02. Operações básicas 03. Representação de linguagens 04. Formalização de gramáticas 05. Processo de derivação 06.
Analisador sintático: Tipos de análises sintáticas
Reverso de uma Linguagem Regular
1 Decidibilidade continuação…. 2 Teorema: Para qualquer linguagem recursivamente enumerável é indecidível determinar se é finita Prova: Vamos reduzir.
Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.
ADMINISTRAÇÃO INTERDISCIPLINAR
Transcrição da apresentação:

5.5 – Análise Bottom-Up Tentativa de construir uma árvore sintática para a sentença analisada, começando das folhas, indo em direção à raiz (pós-ordem , em alguns métodos) Esse processo pode ser encarado como a redução total de uma sentença ou um programa ao símbolo inicial da gramática Redução unitária (ou simplesmente redução): numa forma sentencial, uma sub-cadeia de símbolos igual ao lado direito de uma produção é substituído pelo não-terminal do lado esquerdo dessa produção

Exemplo: Risco: escolher reduções erradas e nunca chegar ao símbolo inicial S

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Uma forma sentencial pode apresentar várias alternativas conflitantes para reduções: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Se a gramática não for ambígua, só uma delas coopera para se chegar ao símbolo inicial

5.5.1 – Análise por deslocamento e redução Os átomos da sentença são deslocados um por um para dentro de uma pilha para reduções Essas ocorrem para terminais e/ou não-terminais do topo da pilha Se a sub-cadeia é devidamente escolhida a cada redução, o resultado é uma completa derivação mais à direita reversa

a b b c d e  a A b c d e  a A d e  a A B e  S Exemplo: Seja a gramática: S  a A B e A  A b c | b B  d Seja a sentença abbcde e sua redução total a S: a b b c d e  a A b c d e  a A d e  a A B e  S Esta redução total é inversa a seguinte derivação mais à direita: S md a A B e md a A d e md a A b c d e md a b b c d e

A ser feita mais tarde, quando ‘d’ cair na pilha S  a A B e A  A b c | b B  d Sentença abbcde e sua redução total a S: a b b c d e  a A b c d e  a A d e  a A B e  S Três possíveis reduções da forma sentencial: a A b c d e A Redução escolhida A ser feita mais tarde, quando ‘d’ cair na pilha Não leva a S, mas é o primeiro lado direito que se forma no topo da pilha A B

a b b c d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a b b c d e

a b b c d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a b b c d e

a b b c d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a b b c d e Lado direito de uma produção: Reduzir

a A b c d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A b c d e

a A b c d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A b c d e Lado direito de uma produção: Não reduzir

a A b c d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A b c d e Lado direito de uma produção: Reduzir

a A d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A d e

a A d e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A d e Lado direito de uma produção: Reduzir

a A B e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A B e

a A B e S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada a A B e Lado direito de uma produção: Reduzir

S S  a A B e A  A b c | b B  d Simulação da redução de a b b c d e: Observa-se que Pilha  Entrada é uma forma sentencial (derivada de S), se a entrada for correta Pilha Entrada S Aceitar a cadeia de entrada

Exemplo: seja a gramática L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação # 10*(5+3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação # 10*(5+3)$# d

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação #C10 *(5+3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $ Pilha Entrada Ação #C10 *(5+3)$# r: F  C

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $ Pilha Entrada Ação #F *(5+3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $ Pilha Entrada Ação #F *(5+3)$# r: T  F

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $ Pilha Entrada Ação #T *(5+3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $ Pilha Entrada Ação #T *(5+3)$# d d d

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $ Pilha Entrada Ação #T*(C5 +3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $ Pilha Entrada Ação #T*(C5 +3)$# r: F  C

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $ Pilha Entrada Ação #T*(F +3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $ Pilha Entrada Ação #T*(F +3)$# r: T  F

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $ Pilha Entrada Ação #T*(T +3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $ Pilha Entrada Ação #T*(T +3)$# r: E  T

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $ Pilha Entrada Ação #T*(E +3)$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $ Pilha Entrada Ação #T*(E +3)$# d d

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $ Pilha Entrada Ação #T*(E+C3 )$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $ Pilha Entrada Ação #T*(E+C3 )$# r: F  C

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $ Pilha Entrada Ação #T*(E+F )$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $ Pilha Entrada Ação #T*(E+F )$# r: T  F

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$ Pilha Entrada Ação #T*(E+T )$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$ Pilha Entrada Ação #T*(E+T )$# r: E  E+T

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$ Pilha Entrada Ação #T*(E )$#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$ Pilha Entrada Ação #T*(E )$# d

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$ Pilha Entrada Ação #T*(E) $#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$ Pilha Entrada Ação #T*(E) $# r: F  (E)

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $ Pilha Entrada Ação #T*F $#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $ Pilha Entrada Ação #T*F $# r: T  T*F

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $ Pilha Entrada Ação #T $#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $ Pilha Entrada Ação #T $# r: E  T

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $ Pilha Entrada Ação #E $#

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $ Pilha Entrada Ação #E $# d

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $ Pilha Entrada Ação #E$ #

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $ Pilha Entrada Ação #E$ # r: L  E$

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $  L Pilha Entrada Ação #L #

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $  L Pilha Entrada Ação #L # aceitar

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Derivação mais à direita reversa: 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T * ( 5 + 3 ) $  T * ( F + 3 ) $  T * ( T + 3 ) $  T * ( E + 3 ) $  T * ( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $  L Pilha Entrada Ação #L #

Análise da expressão 10 * (5 + 3)$ L  E $ E  E opad T | T T  T opmult F | F F  cte | ( E ) Análise da expressão 10 * (5 + 3)$ Além das ações de deslocar, reduzir e aceitar, há também a de tratar erro Pilha Entrada Ação #L #

Há reduções legais e ilegais Reduções ilegais: não levam ao símbolo inicial Exemplos de reduções ilegais: E E E T T T F F F 10 * ( 5 + 3 ) $

Das reduções legais, qual fazer? Com deslocamento e redução, escolhe-se a da esquerda É a que se forma primeiro na pilha F F F 10 * ( 5 + 3 ) $ Numa gramática não-ambígua, asa de uma forma sentencial é o lado direito da redução legal mais à esquerda Redução escolhida

Numa gramática não-ambígua, asa de uma forma sentencial é o lado direito da redução legal mais à esquerda Asa em Inglês é handle (termo usado nos livros) Numa tal gramática, a asa de uma forma sentencial é única Em gramáticas ambíguas, há formas sentenciais com mais de uma asa Então é necessário definir asa de modo mais abrangente

Asa de uma forma sentencial: Uma de suas sub-cadeias que corresponde ao lado direito de uma produção tal que Sua redução para o não-terminal à esquerda dessa produção representa um passo de uma derivação mais à direita reversa Em gramáticas ambíguas, pode haver sentenças com mais de uma derivação mais à direita O grande problema é determinar qual(ais) a(s) asa(s) de uma forma sentencial, para poder fazer uma redução Nesta disciplina não serão abordadas gramáticas ambíguas

a b b c d e  a A b c d e  a A d e  a A B e  S Exemplo: Asas da redução de abbcde a b b c d e  a A b c d e  a A d e  a A B e  S Exemplo: Asas da redução de 10 * ( 5 + 3 ) $ 10 * ( 5 + 3 ) $  F * ( 5 + 3 ) $  T*( 5 + 3 ) $  T * ( F+3 ) $  T * ( T+3 ) $  T * ( E+3 ) $  T *( E + F ) $  T * ( E+T )$  T * ( E )$  T * F $  T $  E $  L Análise por deslocamento e redução faz o corte das asas formadas no topo da pilha Sem ambiguidades, uma vez formada a asa no topo da pilha, ela deve ser cortada (reduzida) O problema é identificar asas no topo da pilha

Já que Pilha  Entrada é uma forma sentencial (derivada de S) O conteúdo da pilha é chamado de prefixo dessa forma Prefixo viável de uma forma sentencial é um prefixo dessa forma que não vai além do final da asa mais à direita da mesma:  É um prefixo que pode aparecer na pilha de um analisador por deslocamento e redução

5 e E+T são as asas de suas respectivas formas Para gramáticas não ambíguas, prefixo viável de uma forma sentencial é um prefixo dessa forma que não vai além do final de sua asa Exemplo: sejam as seguintes situações na pilha 5 e E+T são as asas de suas respectivas formas Os prefixos #T*(5+ e #T*(E+T) são inviáveis Deslocar o ‘+’ ou ‘)’ equivale a enterrar asas Pilha Entrada #T*(5 +3)$# Pilha Entrada #T*(E+T )$#

Para gramáticas não ambíguas, prefixo viável de uma forma sentencial é um prefixo dessa forma que não vai além do final de sua asa Um analisador por deslocamento e redução faz detecção de prefixos inviáveis em sua pilha Isso é fundamental para a decisão entre deslocar ou reduzir

5.5.2 – Gramáticas LR(k) e LR(1) Gramáticas LR(k): admitem analisadores por deslocamento e redução que: Analisam as sentenças da esquerda para a direita (L - left) Produzem derivações mais à direita reversas (R - right) Precisam analisar no máximo, os próximos k símbolos, para decidir se vão reduzir ou deslocar e, se forem reduzir, que produção usar Gramáticas LR(1): gramáticas LR(k) em que k = 1

Comparação entre analisadores LL e LR: Analisador LR(k): reconhece o lado direito de uma produção, depois de ter lido todo o trecho do programa derivado desse lado direito, analisando os próximos k terminais de entrada Analisador LL(k): reconhece o uso de uma produção para expandir um não-terminal, analisando os próximos k terminais de entrada, sem levar em consideração nada que já foi lido Analisadores LR utilizam mais informações da entrada que analisadores LL para tomar decisões; suas dúvidas e conflitos são menos numerosas Analisadores LR podem analisar mais gramáticas que LL

5.5.3 – Analisadores LR São analisadores sintáticos para gramáticas LR Métodos LR conseguem analisar GLC’s recursivas à esquerda Um analisador LR consegue detectar um erro sintático tão cedo quanto possível, numa análise da esquerda para a direita da sentença É grande o trabalho de construir um analisador LR manualmente É providencial poder contar com um gerador automático; a ferramenta Yacc é LR

Esquema de um analisador LR:

Autômato: detecta prefixos inviáveis na pilha; governa todo analisador

Elemento da pilha: um símbolo e um estado do autômato

Tabela de ações: Ação[e, a] (a – átomo de entrada corrente e – estado no topo da pilha) pode ser: Deslocar, e’ - e’ é um estado Reduzir, p - p é o número de uma produção A Aceitar Erro

Tabela de transições: Goto[e, A] (e – estado, A – não-terminal) pode ser: Um outro estado Erro

Funcionamento do analisador: Se Ação [em, ai] = Deslocar, e: (e, ai) é empilhado (o autômato muda de estado) ai+1 passa a ser o átomo de entrada corrente

Funcionamento do analisador: Se Ação [em, ai] = Reduzir, p (p é A): r elementos da pilha são desempilhados (r – comprimento de ) (em-r, Xm-r) passa a ser o topo da pilha e  Goto [em-r, A] (e, A) é empilhado (o autômato muda de estado)

Funcionamento do analisador: Se Ação [em, ai] = Aceitar: encerra-se a análise Se Ação [em, ai] = Erro: chama tratamento de erro A saída pode ser a relação de produções usadas nas reduções

Algoritmo 5.8: Análise LR Empilhar (e0); w  sentença || $; p  &(w[0]); Repetir sempre{ e  estado do topo da pilha; a  *p; caso (Ação [e, a]) seja { Aceitar: retornar; Erro: TratarErro ( ); Deslocar, e’: { Empilhar (e’, a); Avançar (p); } Reduzir, p (p = A, r = comprimento()): { Imprimir (A); Desempilhar (r elementos); e  estado do topo da pilha; Empilhar (Goto [e, A], A); }

Exemplo: seja a seguinte gramática de expressões: 1) E  E + T 3) T  T * F 5) F  ( E ) 2) E  T 4) T  F 6) F  id Seja a seguinte sentença em análise: id * id + id Tabelas de ações e transições (construção apresentada a seguir):

Programa analisador LR Estado inicial: Ação: d 5 Sentença de entrada id * + $ Programa analisador LR Saída Pilha

Programa analisador LR Ação: r 6 Sentença de entrada F  id id * + $ Programa analisador LR id 5 Saída Pilha

Programa analisador LR Sentença de entrada F  id id * + $ Programa analisador LR id 5 Saída Pilha

Programa analisador LR Ação: r 4 Sentença de entrada F  id T  F F  id id * + $ Programa analisador LR F 3 Saída Pilha

Programa analisador LR Ação: r 4 Sentença de entrada F  id T  F id * + $ Programa analisador LR F 3 Saída Pilha

Programa analisador LR Ação: d 7 Não reduz segundo E  T Sentença de entrada F  id T  F id * + $ Programa analisador LR T 2 Saída Pilha

Programa analisador LR Ação: d 5 Sentença de entrada F  id T  F id * + $ * 7 Programa analisador LR T 2 Saída Pilha

Programa analisador LR Ação: r 6 Sentença de entrada F  id T  F F  id T  F id * + $ id 5 * 7 Programa analisador LR T 2 Saída Pilha

Programa analisador LR Sentença de entrada F  id T  F id * + $ id 5 * 7 Programa analisador LR T 2 Saída Pilha

Programa analisador LR Ação: r 3 Sentença de entrada F  id T  F T  T*F F  id T  F id * + $ F 10 * 7 Programa analisador LR T 2 Saída Pilha

Programa analisador LR Sentença de entrada F  id T  F T  T*F id * + $ F 10 * 7 Programa analisador LR T 2 Saída Pilha

Programa analisador LR Ação: r 2 Sentença de entrada F  id T  F T  T*F F  id T  F T  T*F E  T id * + $ Programa analisador LR T 2 Saída Pilha

Programa analisador LR Sentença de entrada F  id T  F T  T*F E  T id * + $ Programa analisador LR T 2 Saída Pilha

Programa analisador LR Ação: d 6 Sentença de entrada F  id T  F T  T*F E  T id * + $ Programa analisador LR E 1 Saída Pilha

Programa analisador LR Ação: d 5 Sentença de entrada F  id T  F T  T*F E  T id * + $ + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Ação: r 6 Sentença de entrada F  id T  F T  T*F E  T F  id T  F T  T*F E  T id * + $ id 5 + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Sentença de entrada F  id T  F T  T*F E  T id * + $ id 5 + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Ação: r 4 Sentença de entrada F  id T  F T  T*F E  T F  id T  F T  T*F E  T id * + $ F 3 + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Sentença de entrada F  id T  F T  T*F E  T id * + $ F 3 + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Ação: r 1 Sentença de entrada F  id T  F T  T*F E  T E  E+T F  id T  F T  T*F E  T id * + $ T 9 + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Sentença de entrada F  id T  F T  T*F E  T E  E+T id * + $ T 9 + 6 Programa analisador LR E 1 Saída Pilha

Programa analisador LR Ação: act Sentença de entrada F  id T  F T  T*F E  T E  E+T id * + $ Programa analisador LR E 1 Saída Pilha