Análise Sintática LR Prof. Alexandre Monteiro

Slides:



Advertisements
Apresentações semelhantes
IFTO ESTRUTURA DE DADOS AULA 05 Prof. Manoel Campos da Silva Filho
Advertisements

Software Básico Silvio Fernandes
UNICAMP Universidade Estadual de Campinas Centro Superior de Educação Tecnológica Divisão de Telecomunicações Propagação de Ondas e Antenas Prof.Dr. Leonardo.
INFORMAÇÕES COMPLEMENTARES
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.
A busca das mulheres para alcançar seu espaço dentro das organizações
Material pedagógico Multiplicar x 5 Clica!
Vamos contar D U De 10 até 69 Professor Vaz Nunes 1999 (Ovar-Portugal). Nenhuns direitos reservados, excepto para fins comerciais. Por favor, não coloque.
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
III – Análise sintáctica Geradores de parsers Bibliografia aconselhada: –Aho, Sethi e Ullman – secção 4.9 LFA 1999/ Jorge Morais.
Exercício do Tangram Tangram é um quebra-cabeças chinês no qual, usando 7 peças deve-se construir formas geométricas.
Nome : Resolve estas operações começando no centro de cada espiral. Nos rectângulos põe o resultado de cada operação. Comprova se no final.
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 ­
Sumário Bem ou serviço compósito = dinheiro Exercícios 2 Exercícios 3.
Software Básico Silvio Fernandes
Curso de ADMINISTRAÇÃO
Método de Acesso Dinâmico - B-Tree AULA 14 Profa. Sandra de Amo Programa de Pós-Graduação em CC - UFU Sistemas de Banco de Dados
EXPRESSÕES ARITMÉTICAS
EXPRESSÕES ARITMÉTICAS
FUNÇÃO MODULAR.
Construção de Compiladores
Construção de Compiladores
Aula 4 Nomes, Vinculações, Tipos e Escopos
EXEMPLOS DE ESTRUTURAS PROTENDIDAS
Provas de Concursos Anteriores
Renda até 2 SM.
Módulo Financeiro Centro de Custo.
Diagnósticos Educativos = Diagnósticos Preenchidos 100% = 1.539
MECÂNICA - DINÂMICA Exercícios Cap. 13, 14 e 17. TC027 - Mecânica Geral III - Dinâmica © 2013 Curotto, C.L. - UFPR 2 Problema
1 CENTRO DE DESENVOLVIMENTO E PLANEJAMENTO REGIONAL – 2006 P Ó S-GRADUA Ç ÃO EM ECONOMIA Microeconomia I Prof.: Edson Domingues Cap í tulo II: Escolha.
CATÁLOGO GÉIA PÁG. 1 GÉIA PÁG. 2 HESTIA PÁG. 3.
Ferramentas para a Construção de Compiladores: Lex & Yacc
Determinar o tipo de gramática
Compiladores, Aula Nº 19 João M. P. Cardoso
Estruturas de Dados com Jogos
Lemas (Sudkamp)  .
Coordenação Geral de Ensino da Faculdade
Coordenação Geral de Ensino da Faculdade
Múltiplos de um número Sonia Regina de Souza Guedes.
Plataforma Brasil – Submissão de pesquisa
Aula 17 1 Análise Sintáctica Compiladores, Aula Nº 17 João M. P. Cardoso.
Estudo dos Gases Prof. Fabio Costa.
Projeto Marcas que Eu Gosto 1 PROJETO MARCAS QUE EU GOSTO Estudos Quantitativo de Consumidores Janeiro / 2005.
C ORROPIOS, C ARDINCHAS E C ÃES G RANDES O LIVRO de José Paixão em imagens – com pistas de leitura propostas por por www.joraga.net.
Semântica de Linguagens de Programação
1 JavaCC Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife.
Geração de Código Intermediário
1 Aplicações do Fecho Regular. 2 A interseção de uma linguagem livre de contexto e uma linguagem regular é uma linguagem livre de contexto livre de contexto.
Aulão de Linguagens Formais e Compiladores
Olhe fixamente para a Bruxa Nariguda
Máquina de Turing Universal
Prof. Guilherme Alexandre Monteiro Reinaldo Recife
Equipe Bárbara Régis Lissa Lourenço Lucas Hakim Ricardo Spada Coordenador: Gabriel Pascutti.
Análises léxica e sintática
Analisador Léxico Prof. Alexandre Monteiro
AM020C A interface entre Meio Ambiente, Sociedade e Economia Indicadores de produtividade e empregabilidade da agricultura do Brasil. Aluna Andressa Santos.
Análise Sintática Prof. Alexandre Monteiro
Análise Léxica Prof. Alexandre Monteiro
1 Características do Projeto Web Prof. Alexandre Monteiro Recife.
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.
Hibernate Mapeamento Objeto-Relacional Aula Prática I
Revisão Compiladores – AP2
Análise Sintática de Descida Recursiva
Analisador sintático: Tipos de análises sintáticas
Transcrição da apresentação:

Análise Sintática LR Prof. Alexandre Monteiro Baseado em material cedido pelo Prof. Euclides Arcoverde Recife

Contatos Prof. Guilherme Alexandre Monteiro Reinaldo Apelido: Alexandre Cordel E-mail/gtalk: alexandrecordel@gmail.com greinaldo@fbv.edu.br Site: http://www.alexandrecordel.com.br/fbv Celular: (81) 9801-1878

Análise Sintática LR Exemplo: JavaCC, yacc, CUP É uma técnica de análise sintática bottom-up (ascendente) Também chamada de shift-reduce Usada em vários geradores automáticos de parsers Exemplo: JavaCC, yacc, CUP

Analisador Sintática LR Existem diversos tipos de analisadores LR(k) O nome LR(k) indica Left-to-right – a ordem de leitura dos tokens é da esquerda para a direita Rigthmost derivation – encontra uma derivação mais à direita (porém, de trás para a frente) K token são olhados à frente (lookahead)

Analisador Sintática LR O tipo que veremos é chamado LR(0) Alguns tipos importantes são SLR(1) – Simple LR(1) LALR(1) – Look-Ahead LR(1) O LALR(1) é usado nos principais geradores de parsers

Assuntos Princípios de funcionamento Construção do autômato LR(0) Sobre o parser LR(0) veremos Princípios de funcionamento Construção do autômato LR(0) Construção das tabelas ACTION e GOTO Exemplo de execução

Princípios de Funcionamento

Funcionamento Símbolos terminais lidos de uma entrada Na prática, são os tokens, obtidos um por vez por meio do lexer Símbolos terminais (já lidos da entrada) e não-terminais podem ser inseridos em uma pilha

Funcionamento As ações do parser são construídas com base num autômato construído a partir da gramática Cada símbolo inserido na pilha, levará o autômato a um novo estado Assim, na pilha, junto com cada símbolo haverá o estado do autômato O “estado atual” será o estado no topo da pilha

Funcionamento SHIFT REDUCE ACCEPT ERROR A medida que lê os terminais (tokens), o parser poderá realizar certas ações, de acordo com o estado atual SHIFT REDUCE ACCEPT ERROR

Ações Pega o próximo terminal da entrada e insere no topo da pilha Ação SHIFT <estado> Pega o próximo terminal da entrada e insere no topo da pilha Realizada quando o parser precisa de mais informações sobre a entrada para formar a árvore Junto com o terminal, insere o próximo estado

Ações Ação REDUCE X Realizada quando o parser reconhecer que os símbolos no topo da pilha formam a cadeia  Na árvore (se for criada), X será pai de toda a cadeia  O parser remove toda a cadeia  da pilha e observa o estado atual (no topo) Insere o símbolo X junto com o próximo estado (que dependerá do estado atual)

Ações Ação ACCEPT Indica que a entrada terminou e está correta (toda a árvore pode ser criada) Ação ERROR Indica que a entrada está errada

Funcionamento A escolha das ações do parser será dada por uma tabela ACTION Outra tabela auxiliar usada é a tabela GOTO, usada apenas quando a ação for “reduce”

Funcionamento Tabela ACTION Diz qual ação será tomada, de acordo com o estado atual e o próximo token Tabela GOTO (usada durante um reduce) Diz qual o próximo estado, de acordo com o estado atual e o símbolo não-terminal que foi reduzido

Autômato e Tabelas Veremos a seguir como é construído o autômato a partir de uma gramática qualquer dada Depois, a partir do autômato, veremos como criar as tabelas ACTION e GOTO

Construção do Autômato LR(0)

Construção do Autômato O primeiro passo é estender a gramática com a produção S’S (ou S’S$), onde: S é o símbolo inicial original $ indica fim de arquivo (EOF) Essa gramática é chamada de gramática estendida

Itens LR(0) Indicam em que parte de uma produção a análise sintática pode estar, num certo instante Um ponto é usado para indicar a posição Para cada produção X  YZW , temos os itens X  .YZW X  Y.ZW X  YZ.W X  YZW.

Autômato LR(0) Os itens serão usados para criar um autômato em que Cada estado é uma coleção de itens As transições entre estados acontecem quando um símbolo (terminal ou não) é lido/reconhecido Não existe estado final

Autômato LR(0) O estado inicial será o item S’.S Para todo item X.Y , com Y não-terminal, adicionar ao mesmo estado os itens Y. , para toda produção de Y Para todo item X.Y , criar uma transição que: Lê o símbolo Y (terminal ou não) Leva ao estado formado por XY.

Autômato LR(0) Depois de concluído o autômato, os estados devem ser numerados, para facilitar O autômato pode, então, ser usado para criar as tabelas ACTION e GOTO do parser

Construção das Tabelas

Relembrando as Tabelas Tabela ACTION Diz qual ação será tomada, de acordo com o estado atual e o próximo token Tabela GOTO (usada após um reduce) Diz qual o próximo estado, de acordo com o estado atual e o símbolo não-terminal que foi reduzido

Construção das Tabelas Para criar ambas as tabelas, é preciso analisar os itens LR(0) de cada estado do autômato Descreveremos apenas as situações em que as entradas das tabelas são bem definidas Nos demais casos, subentende-se que a ação é de erro

Tabela GOTO A tabela GOTO é a mais simples de construir Se o estado tiver um item com um ponto antes de um não-terminal N, assim: X.N Quando o não-terminal reduzido for N, ir para o estado do autômato que tem o ponto depois do não-terminal, assim: XN.

Tabela ACTION Fazer um SHIFT, quando o próximo símbolo for t Se o estado tiver um item com um ponto antes de um terminal t assim: X.t Fazer um SHIFT, quando o próximo símbolo for t Ir para o estado que tem o ponto depois do terminal, assim: Xt.

Tabela ACTION Se o estado tiver um item com um ponto no final da produção assim: X. Fazer um REDUCE para a produção X , qualquer que seja o próximo símbolo Observação: Após o parser realizar o reduce, ele consultará a tabela GOTO para decidir o próximo estado

Tabela ACTION Um caso especial será definido quando o estado tiver o item S’S. Neste caso, a ação será ACCEPT, apenas se o próximo símbolo for $

Exemplo de Execução

Exemplo (quadro) 0) S: stmt $ 1) stmt: ID ':=' expr 2) expr: expr '+' ID 3) expr: expr '-' ID 4) expr: ID

Exemplo (autômato) State 3 1) stmt: ID ':=' . expr 0) S: . stmt $ 1) stmt: . ID ':=' expr State 1 0) S: stmt . $ State 2 1) stmt: ID . ':=' expr State 3 1) stmt: ID ':=' . expr 2) expr: . expr '+' ID 3) expr: . expr '-' ID 4) expr: . ID

Exemplo (autômato) 4) expr: . ID GOTO 6 on expr SHIFT 5 on ID State 4 0) S: . stmt $ 1) stmt: . ID ':=' expr GOTO 2 on stmt SHIFT 1 on ID State 1 1) stmt: ID . ':=' expr SHIFT 3 on ':=' State 2 0) S: stmt . $ SHIFT 4 on $ State 3 1) stmt: ID ':=' . expr 2) expr: . expr '+' ID 3) expr: . expr '-' ID 4) expr: . ID GOTO 6 on expr SHIFT 5 on ID State 4 0) S: stmt $. State 5 4) expr: ID . State 6 1) stmt: ID ':=' expr . 2) expr: expr . '+' ID 3) expr: expr . '-' ID SHIFT 7 on '+' SHIFT 8 on '-' State 7 2) expr: expr '+' . ID SHIFT 9 on ID State 8 3) expr: expr '-' . ID SHIFT 10 on ID State 9 2) expr: expr '+' ID . State 10 3) expr: expr '-' ID .

Exemplo (Tabelas)

Exemplo: a:= b + c - d

Exemplo O que acontece ao tentar criar as tabelas de parsing LR(0) para a gramática abaixo? E → 1 E | 1

Conflitos na Criação de Parsers LR

Conflitos Um mesmo estado do autômato pode ter itens que permitam mais de uma ação, gerando conflitos na criação das tabelas Conflitos possíveis: SHIFT/REDUCE: em um mesmo estado, o parser não consegue decidir se faz um shift ou um reduce REDUCE/REDUCE: em um mesmo estado, o parser pode fazer reduce para duas produções diferentes e ele não consegue decidir qual escolher

Conflitos em Parsers LR(0) Os tipos de conflitos citados podem aparecer com qualquer técnica de construção de parser LR Para ilustrar, veremos como esses conflitos acontecem na construção de parsers LR(0)

Conflitos em Parsers LR(0) Se o estado tiver um item X.t e outro X. O primeiro item indica que se deve fazer um shift de t, enquanto o segundo indica para fazer um reduce para a produção X Conflito SHIFT/REDUCE ! É o que aconteceria na gramática E → 1 E | 1

Conflitos em Parsers LR(0) Se o estado tiver um item X. e outro Y. Neste caso, o parser poderia fazer o reduce para duas produções diferentes Conflito REDUCE/REDUCE !

Tratamento de Conflitos Dependendo do caso, os conflitos podem ser tratados das seguintes maneiras Alterando a gramática, ou Definindo precedências para as produções, ou Usando outra técnica LR (SLR, LALR, etc.) Veremos a SLR...

Parser SLR

Parser SLR “Simple LR(1)” É um caso simples de parser LR(1) Vamos comparar a técnica LR(0) vista antes com o princípio dos parsers LR(1)

LR(0) x LR(1) O parser LR(0) visto antes tem o número 0 no nome porque a ação a ser tomada (shift ou reduce) independe do próximo token Ele poderia simplesmente fazer a ação olhando só para os símbolos que já estão na pilha Olha “zero” tokens adiante Já um parser LR(1) confere 1 token à frente para escolher a ação Pode ter uma ação específica para cada token

Parser SLR Não veremos como construir um parser LR(1) canônico, mas veremos o SLR(1), que é mais simples O LR(1) canônico usa um autômato especial chamado autômato LR(1) Não veremos... Mas a técnica SLR(1) usa o mesmo autômato LR(0) que vimos até agora

Parser SLR Funciona de maneira muito parecida com o LR(0) O parser SLR(1) Funciona de maneira muito parecida com o LR(0) É baseado no mesmo autômato LR(0) Na prática, a diferença para o LR(0) será apenas na construção da tabela

Parser SLR Na construção da tabela ACTION para o parser SLR(1), uma ação só será escolhida se o próximo símbolo (1 à frente) estiver “correto” O critério para escolha da ação “SHIFT” não mudará em relação ao parser LR(0), porque essa ação já considera o próximo símbolo Já o “REDUCE X” só será a ação válida para os tokens que podem aparecer após o não-terminal X

Parser SLR Os símbolos que podem vir após o não-terminal X são exatamente o conjunto FOLLOW(X) visto em aulas passadas

Conjunto FOLLOW Aplicado a não-terminais N quaisquer FOLLOW (N) Aplicado a não-terminais N quaisquer É o conjunto de terminais que podem aparecer à direita do não-terminal N, em alguma cadeia derivada pela gramática Se o símbolo inicial deriva uma cadeia “... N t ...” então t faz parte de FOLLOW(A)

Parser SLR Assim, na construção da tabela ACTION de um parser SLR, se tiver um item X. em um estado do autômato... A ação naquele estado será REDUCE X, apenas para os símbolos que estão em FOLLOW(X) O restante é idêntico ao LR(0)...

Parser SLR Com essa simples alteração no critério de escolha para a ação REDUCE, essa técnica consegue tratar mais gramáticas do que a LR(0) Ela evita que aconteça alguns casos de conflitos SHIFT / REDUCE como o que vimos no início da aula

Exemplo Construir as tabelas de parsing SLR (0) S → E (1) E → 1 E Dada a gramática abaixo Construir as tabelas de parsing SLR (0) S → E (1) E → 1 E (2) E → 1

Exemplo Estado 0 S → • E E → • 1 E E → • 1 Estado 1 E → 1 • E E → 1 •

Exemplo Tabelas de parsing SLR FOLLOW(E) = {$}, então REDUCE só é valido para $

Parser SLR A análise sintática SLR é uma extensão simples e eficaz da análise LR(0) Ela é capaz de tratar quase todas as estruturas práticas de linguagens de programação No entanto, existem algumas poucas situações que a análise SLR é incapaz de tratar Para esses casos, é comum usar um método LR(1) mais avançado (que não veremos) que é o chamado LALR(1) Usado no CUP, yacc e diversos outros geradores de parsers

Exercício SLR Construir as tabelas de parsing SLR Dada a gramática abaixo Construir as tabelas de parsing SLR Fazer o reconhecimento de “n+n+n” E → n + E | n

Exemplo Estado 0 S → • E E → • n + E E → • n Estado 1 E → n • + E

Exercício Tabelas de parsing SLR

Exercício Reconhecimento de “n+n+n”

Exercício LR(0) Construir as tabelas de parsing LR(0) Dada a gramática abaixo Construir as tabelas de parsing LR(0) Fazer o reconhecimento de “1+1” (1) E → E * B (2) E → E + B (3) E → B (4) B → 0 (5) B → 1

Exercício Tabelas de parsing LR(0)

Exercício Reconhecimento de “1+1”

Bibliografia AHO, A., LAM, M. S., SETHI, R., ULLMAN, J. D., Compiladores: princípios, técnicas e ferramentas. Ed. Addison Wesley. 2a Edição, 2008 (Capítulo 4)