Análise sintática. Prof. Thiago A. S. Pardo. Análise sintática ascendente

Documentos relacionados
Análise sintática. Questão. E se a análise sintática pudesse ser modelada por autômatos?

Análise sintática. Análise sintática ascendente. Parte-se dos símbolos terminais em direção ao símbolo inicial da gramática. Derivação mais à direita

Análise sintática. Análise sintática ascendente. Bottom-up, ascendente ou redutiva. Analisadores de precedência de operadores Analisadores LR

Análise sintática. Análise sintática. Top-down ou descendente. Com retrocesso: por tentativa e erro. Preditiva: para gramáticas LL(1) 09/04/2012

Analisadores Sintáticos LR

Reduce: reduz o que está imediatamente à esquerda do foco usando uma produção

Compiladores - Análise SLR

Compiladores - Análise Ascendente

Compiladores - Análise Ascendente

Compiladores I. Caracterizar um método de análise bottom-up. Compreender os mecanismos básicos envolvidos no processo de análise LR.

Revisão. Fases da dacompilação

Compiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

BNF (Backus-Naur Form) Gramática Livres de Contexto / Estruturas Recursivas

Análise Sintática (Cap. 04) Análise Sintática Ascendente Analisador Sintático LR

Construção de Compiladores Aula 18 - Análise Sintática Ascendente

Compiladores. Top-Down x Bottom Up. Plano da aula. Redução exemplo 1. Redução exemplo 1. Lembrando: construir a tabela de análise LL(1) A Abc b B d

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

Introdução Análise Sintática Descendente Análise Sintática Ascendente. Aula Prática. Fernando Antônio Asevedo Nóbrega

Compiladores. Análise Sintática

INE5318 Construção de Compiladores. AULA 4: Análise Sintática

Análise Sintática Bottom-up

Compiladores - Gramáticas

INE5317 Linguagens Formais e Compiladores. AULA 10: Anális e S intática

Compiladores - Gramáticas

Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Função, interação com o compilador Especificação e reconhecimento de tokens Implementação Tratamento de erros. Prof. Thiago A. S.

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Compiladores. Análise Sintática

Análise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR

Gramáticas Livres de Contexto Parte 1

Compiladores - Gramáticas

Compiladores - Análise LL(1)

V Teoria de Parsing. Termos Básicos: Parser Analisador Sintático Parsing Analise Sintática Parse Representação da analise efetuada

Compiladores - Análise LL(1)

Análise Sintática II: Analisadores Descendentes Preditivos

Capítulo 5 Análise sintática

Estrutura geral de um compilador programa-fonte

Compilação: Erros. Detecção de Erros: * Analisadores Top-Down - Preditivo Tabular (LL) - Feito a mão. * Analisadores Botton-Up: - Shift-Reduce (SLR)

Linguagens Livres de Contexto

Análise Sintáctica. Definições: Conjuntos First() e Follow() Compiladores, Aula Nº 19 João M. P. Cardoso. Conjunto First(β)

V Análise Sintática. V.1.1 Gramáticas Livres de Contexto Definições de GLC

Vantagens de uma Gramática. Sintaxe de uma Linguagem. Analisador Sintático - Parser. Papel do Analisador Sintático. Tiposde Parsers para Gramáticas

Compiladores. Exemplo. Caraterísticas de Gramáticas. A αβ 1 αβ 2. A αx X β 1 β 2. Lembrando... Gramáticas Livres de Contexto

Linguagens Formais e Autômatos P. Blauth Menezes

Compiladores Aula 6. Celso Olivete Júnior.

Análise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18

Análise Sintática. Fabiano Baldo

Linguagens Livres do Contexto. Adaptado de H. Brandão

Compiladores - JACC. Fabio Mascarenhas

Analisadores Ascendentes ou Empilha-Reduz. Mais um exemplo... Mais um exemplo... Top-Down x Bottom Up. Conteúdo da aula. Analisadores Ascendentes

Construção de Compiladores Aula 17 - Análise Sintática Descendente

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

Análise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34

Construção de Compiladores Aula 16 - Análise Sintática

Análise Sintática - Final

Análise Sintática Introdução

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1

Autômatos com Pilha: Reconhecedores de LLCs

Linguagens Livres de Contexto

Análise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42

Parsing Preditivo. Antes de ser abordado o Parsing Preditivo, será apresentado o Analisador Sintático Descendente Recursivo.

Como construir um compilador utilizando ferramentas Java

Analisadores Descendentes Tabulares; Cjs First Follow

FOLHA DE PROVA. Descreva e ilustre, com um exemplo, o algoritmo de minimização de um autômato.

Aula de 28/10/2013. sticas; Implementação. em Ruby

Compiladores. Parser LL 10/13/2008

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

Compiladores. Prof. Bruno Moreno Aula 8 02/05/2011

Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)

Como construir um compilador utilizando ferramentas Java

Construção de Compiladores

INE5317 Linguagens Formais e Compiladores AULA 9: Propriedades e Reconhecimento das Linguagens Livres do Contexto

Compiladores: P ASCAL jr

Problemas decidíveis para LICs

Análise Sintática. Compiladores Cristina C. Vieira. Compiladores 2012/2013

Linguagens Livres de Contexto

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

Análise sintática. Prof. Thiago A. S. Pardo Tratamento de erros sintáticos

Apresentação. !! Familiarização com os métodos de construção de compiladores de linguagens e com as técnicas de compilação mais habituais.

Concurso Público para provimento de cargo efetivo de Docentes. Edital 20/2015 CIÊNCIA DA COMPUTAÇÃO II Campus Rio Pomba

Conceitos de Linguagens de Programação

Automata e Linguagens Formais

a n Autômatos com Pilha: Definição Linguagem Aceita por um AP Notação gráfica para AP APD X APND

Problemas decidíveis para LICs

Tokens, Padroes e Lexemas

Universidade Federal de Alfenas

COMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática

a n Autômatos com Pilha: Definição Linguagem Aceita por um AP Notação gráfica para AP APD X APND

Introdução Uma linguagem de programação apoiada em um paradigma imperativo apresenta algum grau de dificuldade nos aspectos relativos ao contexto;

Linguagens de Programação Aula 5

IV Gramáticas Livres de Contexto

Construção de Compiladores Aula 3 - Analisador Sintático

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Universidade Federal de Alfenas

Análise Sintática Descendente

Plano da aula. Compiladores. Os erros típicos são sintáticos. Análise Sintática. Usando Gramáticas. Os erros típicos são sintáticos

Eduardo Belo de Araújo. Analisador ANSI-C

UNIVERSIDADE ESTADUAL DO SUDOESTE DA BAHIA DEPARTAMENTO DE CIÊNCIAS EXATAS E TECNOLÓGICA CURSO DE CIÊNCIA DA COMPUTAÇÃO JÂNITOR MÁRCIO SILVA PRATES

Transcrição:

Análise sintática Função, interação com o compilador Análise descendente e ascendente Especificação e reconhecimento de cadeias de tokens válidas Implementação Tratamento de erros Prof. Thiago A. S. Pardo 1 Análise sintática ascendente Bottom-up, ascendente ou redutiva Analisadores de precedência de operadores Analisadores LR SLR: Simple LR LR Canônico Look Ahead LR: LALR 2 1

ASA: precedência de operadores Exercício: reconheça a expressão (id) <E> ::= <E>/<T> <T> <T> ::= <T>&<F> <F> <F> ::= (<E>) id Pilha Cadeia Regra $ (id)$ Tabela sintática id / & ( ) $ id > > > > / < > < < > > & < > > < > > ( < < < < = ) > > > > $ < < < < 3 ASA: precedência de operadores Exercício: reconheça a expressão (id) <E> ::= <E>/<T> <T> <T> ::= <T>&<F> <F> <F> ::= (<E>) id Tabela sintática id / & ( ) $ id > > > > / < > < < > > & < > > < > > ( < < < < = ) > > > > $ < < < < Pilha Cadeia Regra $< (id)$ empilha $<(< id)$ empilha $<(<id> )$ reduz $<(= )$ empilha $<(=)> $ reduz $E $ SUCESSO 4 2

ASA: precedência de operadores Algorimo do ASA de precedência de operadores Seja S o símbolo inicial da gramática, a o símbolo terminal mais ao topo da pilha e b o primeiro símbolo da cadeia de entrada repita se ($S é o topo da pilha e $ é o primeiro símbolo da cadeia) então SUCESSO senão se (a<b ou a=b) então empilha b senão se (a>b) então desempilha até haver < entre o terminal do topo e o último desempilhado senão ERRO 5 ASA: precedência de operadores 2 métodos para construção da tabela sintática Intuitivo: baseado no conhecimento da precedência e associatividade dos operadores Mecânico: obtem-se a tabela diretamente da gramática 6 3

ASA: precedência de operadores Método intuitivo Para 2 operadores quaisquer x e y 1. Se x tem maior precedência do que y, então tem-se x (na pilha) > y (na cadeia) e y (na pilha) < x (na cadeia) Exemplo: como * tem maior precedência que +, então *>+ e +<* 2. Se x e y têm precedência igual (ou são iguais) e são associativos à esquerda, então tem-se x>y e y>x; se são associativos à direita, então tem-se x<y e y<x Exemplo: como * e / têm a mesma precedência e são associativos à esquerda, tem-se *>/ e />*; como o operador de exponenciação ** é associativo à direita, tem-se **<** 7 ASA: precedência de operadores 3. As relações entre os operadores e os demais símbolos terminais (operandos e delimitadores) são fixas Para qualquer operador x, tem-se x>$, $<x, x<id, id>x, x<(, (<x, x>) e )>x 4. As relações entre os operandos também são fixas (<(, )>), id>), $<(, (=), )>$, id>$, $<id, (<id 8 4

ASA: precedência de operadores Exemplo: construir a tabela sintática para a gramática abaixo <E> ::= <E>+<E> <E>*<E> <E>**<E> (<E>) id sabendo-se que: ** tem maior precedência e é associativo à direita; * tem precedência intermediária e é associativo à esquerda; + tem menor precedência e é associativo à esquerda + * ** ( ) id $ + * ** ( ) id $ 9 ASA: precedência de operadores Exemplo: construir a tabela sintática para a gramática abaixo <E> ::= <E>+<E> <E>*<E> <E>**<E> (<E>) id sabendo-se que: ** tem maior precedência e é associativo à direita; * tem precedência intermediária e é associativo à esquerda; + tem menor precedência e é associativo à esquerda + * ** ( ) id $ + > < < < > < > * > > < < > < > ** > > < < > < > ( < < < < = < ) > > > > > id > > > > > $ < < < < < OK 10 5

ASA: precedência de operadores Método mecânico: aplicável para gramáticas não ambíguas Para os terminais a e b 1. a=b se αaβbγ é lado direito de produção e β é λ ou um único símbolo não terminal 2. a<b se αaxβ é lado direito de produção e X produz γbδ e γ é λ ou um único símbolo não terminal 3. $<b se S produz γbδ e γ é λ ou um único símbolo não terminal 4. a>b se αxbβ é lado direito de produção e X produz γaδ e δ é λ ou um único símbolo não terminal 5. a>$ se S produz γaδ e δ é λ ou um único símbolo não terminal 11 ASA: precedência de operadores Em outras palavras Um terminal a seguido imediatamente de um não terminal X tem precedência menor do que os primeiros símbolos terminais deriváveis a partir de X (precedidos de λ ou um não terminal) Todos os últimos terminais que podem ser derivados a partir de um não terminal X (seguidos de λ ou um não terminal) têm precedência maior do que um terminal que segue imediatamente a X 12 6

ASA: precedência de operadores Exemplo: construir a tabela sintática para a gramática abaixo <E> ::= <E>+<E> <E>*<E> <E>**<E> (<E>) id Inicialmente, deve-se eliminar a ambiguidade da gramática (mantendo a precedência e a associatividade dos operadores) <E> ::= <E>+<T> <T> <T> ::= <T>*<F> <F> <F> ::= <P>**<F> <P> <P> ::= id (<E>) 13 ASA: precedência de operadores Determinam-se, para cada não terminal, os primeiros e últimos terminais possíveis de ocorrerem em uma cadeia derivada a partir do não terminal Primeiros Últimos E + * ** ( id + * ** ) id T * ** ( id * ** ) id F ** ( id ** ) id P id ( id ) <E> ::= <E>+<T> <T> <T> ::= <T>*<F> <F> <F> ::= <P>**<F> <P> 14 <P> ::= id (<E>) 7

ASA: precedência de operadores Para computar <, procurar pares ax nos lados direitos de produção; tem-se que a tem menor precedência do que qualquer primeiro terminal derivado a partir de X Pares: +T *F **F (E Relações: + < {*,**,(,id} * < {**,(,id} ** < {**,(,id} ( < {+,*,**,(,id} <E> ::= <E>+<T> <T> <T> ::= <T>*<F> <F> <F> ::= <P>**<F> <P> 15 <P> ::= id (<E>) ASA: precedência de operadores Para computar >, procurar pares Xb nos lados direitos de produção; tem-se que qualquer último terminal derivado de X tem precedência maior do que b Pares: E+ T* P** E) Relações: {+,*,**,),id} > + {*,**,),id} > * {),id} > ** {+,*,**,),id} > ) <E> ::= <E>+<T> <T> <T> ::= <T>*<F> <F> <F> ::= <P>**<F> <P> 16 <P> ::= id (<E>) 8

ASA: precedência de operadores Para computar =, procurar aβb nos lados direitos das produções, onde β é λ ou um não terminal, e fazer a=b Dada o lado direito (E), tem-se (=) $ tem precedência menor do que todos os primeiros terminais deriváveis a partir do símbolo inicial da gramática $ < {+,*,**,(,id Todos os últimos terminais derivados a partir do símbolo inicial da gramática têm precedência maior do que $ {+,*,**,),id} > $ <E> ::= <E>+<T> <T> <T> ::= <T>*<F> <F> <F> ::= <P>**<F> <P> 17 <P> ::= id (<E>) Exercício Construir a tabela sintática para a gramática abaixo pelo método mecânico e reconhecer cadeia (a*b) S ( S O S ) a b O + * 18 9

Resposta Transformando a gramática S ( S + S ) ( S * S ) a b 19 Resposta Primeiros e últimos Primeiros Últimos S ( a b ) a b S ( S + S ) ( S * S ) a b 20 10

Resposta Relações <: construções do tipo ax ( S + S * S ( < {(,a,b} + < {(,a,b} * < {(,a,b} + * ( ) a b $ + < < < * < < < ( < < < ) a b $ Primeiros Últimos S ( a b ) a b S ( S + S ) ( S * S ) a b 21 Resposta Relações >: construções do tipo Xb S + S ) S * {),a,b} > + {),a,b} > ) {),a,b} > * + * ( ) a b $ + < < < * < < < ( < < < ) > > > a > > > b > > > $ Primeiros Últimos S ( a b ) a b S ( S + S ) ( S * S ) a b 22 11

Resposta Relações =: construções do tipo axb ( S + + S ) ( S * * S ) ( = + + = ) ( = * * = ) + * ( ) a b $ + < = < < * < = < < ( = = < < < ) > > > a > > > b > > > $ Primeiros Últimos S ( a b ) a b S ( S + S ) ( S * S ) a b 23 Resposta Delimitadores $ < primeiros de S Últimos de S > $ + * ( ) a b $ + < = < < * < = < < ( = = < < < ) > > > > a > > > > b > > > > $ < < < Primeiros Últimos S ( a b ) a b S ( S + S ) ( S * S ) a b 24 12

Resposta Reconhecendo cadeia (a*b) S ( S + S ) ( S * S ) a b + * ( ) a b $ + < = < < * < = < < ( = = < < < ) > > > > a > > > > b > > > > $ < < < Pilha Cadeia Regra $< (a*b)$ empilha $<(< a*b)$ empilha $<(<a> *b)$ reduz $<(= *b)$ empilha $<(=*< b)$ empilha $<(=*<b> )$ reduz $<(=*= )$ empilha $<(=*=)> $ reduz $S $ OK 25 Questão E se a análise sintática pudesse ser modelada por autômatos de estados finitos? 26 13

Análise sintática ascendente Bottom-up, ascendente ou redutiva Analisadores de precedência de operadores Analisadores LR SLR: Simple LR LR Canônico Look Ahead LR: LALR 27 Analisadores LR LR(k): Left to right, Rightmost derivation, with k lookahead symbols LR(1) Ampla classe de gramáticas Método mais genérico e poderoso de análise Podem reconhecer praticamente todas as construções possíveis em linguagens de programação Implementação eficiente Desvantagem: manipulação complexa da tabela sintática Yacc segue esta estratégia 28 14

Analisadores LR Esquema de um analisador LR X i são símbolos gramaticais s i são estados que sumarizam a informação contida abaixo na pilha Cadeia de entrada a 1... a n $ Pilha s m Analisador sintático LR Saída X m s m-1 X m-1 Tabela sintática: ações e transições... s 0 29 Analisadores LR A combinação do estado do topo da pilha e o primeiro símbolo da cadeia de entrada é utilizada para indexar a tabela sintática e determinar o que se faz (empilha ou reduz) Comportamento do analisador Para o estado do topo da pilha s m e o símbolo da entrada a i, consuta-se ação[s m,a i ] na tabela Quatro possíveis valores Empilhamento de um estado Redução por uma regra gramatical Aceitação da cadeia de entrada Erro Pela transição (ou desvio ) indicada na tabela, toma-se um estado e um símbolo gramatical e se produz um novo estado como saída 30 15

Analisadores LR Para o estado do topo da pilha s m e o símbolo da entrada a i, consuta-se ação[s m,a i ] Se ação[s m,a i ]= empilhar s, então empilham-se a i e s Cadeia de entrada a i a i+1... a n $ Pilha s Cadeia de entrada a i+1... a n $ s m Pilha a i s m X m... X m... s 0 s 0 31 Analisadores LR Se ação[s m,a i ]= reduzir A β, então Sendo r o tamanho de β, desempilham-se 2r elementos (r estados e r símbolos gramaticais): o topo torna-se s m-r Empilha-se A (lado esquerdo da regra utilizada) Empilha-se o estado s, indicado por transição[s m-r,a] Cadeia de entrada a i a i+1... a n $ Pilha s Cadeia de entrada a i a i+1... a n $ s m Pilha A s m-r X m... X m-r... s 0 s 0 32 16

Analisadores LR Se ação[s m,a i ]= aceitar, então a análise sintática tem sucesso e é encerrada Se ação[s m,a i ]= erro, então o analisador descobriu um erro e deve tratá-lo 33 Analisadores LR Em outras palavras Sempre deve haver um estado no topo da pilha O estado diz tudo sobre a análise sintática Símbolos gramaticais são dispensáveis na pilha, na realidade Quando se empilha um símbolo gramatical, deve-se empilhar um estado em seguida Ao se reduzir, (i) removem-se da pilha os símbolos gramaticais que correspondem ao lado direito do handle e os estados correspondentes e (ii) empilha-se o lado esquerdo do handle (i.e., um símbolo gramatical), (iii) gerando a necessidade de se empilhar mais um estado 34 17

Analisadores LR Algoritmo de análise LR empilha-se o estado inicial s 0 ; concatena-se o símbolo delimitador $ no final da cadeia de entrada fazer ip apontar para o primeiro símbolo da cadeia repetir seja s n o estado no topo da pilha e a o símbolo apontado por ip se (ação[s n,a]= empilhar s n+1 ) então empilhar a; empilhar s n+1 ; avançar ip; senão se (ação[s n,a]= reduzir A β ) então desempilhar 2* β elementos; empilhar A; empilhar o estado indicado por transição[s n-2* β,a]; senão se (ação[s n,a]= aceitar ) então SUCESSO senão ERRO; fim-repetir; 35 Analisadores LR Reconhecer a cadeia id*id+id (1) <E>::=<E>+<T> (2) <E>::=<T> (3) <T>::=<T>*<F> (4) <T>::=<F> (5) <F>::=(<E>) (6) <F>::=id Na tabela, tem-se que: - si indica empilhar i - ri indica reduzir por regra i De onde vem esse s? Tabela sintática LR Ações Transições Estados id + * ( ) $ E T F 0 s5 s4 1 2 3 1 s6 OK 2 r2 s7 r2 r2 3 r4 r4 r4 r4 4 s5 s4 8 2 3 5 r6 r6 r6 r6 6 s5 s4 9 3 7 s5 s4 10 8 s6 s11 9 r1 s7 r1 r1 10 r3 r3 r3 r3 11 r5 r5 r5 r5 36 18

Analisadores LR Reconhecer a cadeia id*id+id Pilha Cadeia Regra 0 id*id+id$ 37 Analisadores LR Reconhecer a cadeia id*id+id Pilha Cadeia Regra 0 id*id+id$ s5 0id5 *id+id$ r6 0F3 *id+id$ r4 0T2 *id+id$ s7 0T2*7 id+id$ s5 0T2*7id5 +id$ r6 0T2*7F10 +id$ r3 0T2 +id$ r2 0E1 +id$ s6 0E1+6 id$ s5 0E1+6id5 $ r6 0E1+6F3 $ r4 0E1+6T9 $ r1 0E1 $ OK 38 19

Analisadores LR Exercício: reconhecer a cadeia (id) Pilha Cadeia Regra 0 (id)$ 39 Analisadores LR Exercício: reconhecer a cadeia (id) Pilha Cadeia Regra 0 (id)$ s4 0(4 id)$ s5 0(4id5 )$ r6 0(4F3 )$ r4 0(4T2 )$ r2 0(4E8 )$ s11 0(4E8)11 $ r5 0F3 $ r4 0T2 $ r2 0E1 $ OK 40 20

Analisadores LR Notem que Transições são para símbolos não terminais As transições para os símbolos terminais estão implícitas nas ações O estado no topo da pilha oferece toda a informação sobre o handle encontrado Não é preciso percorrer a pilha para encontrar o handle Eficiência 41 21