Compiladores - Gramáticas

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

Compiladores - Gramáticas

Compiladores - Gramáticas

Compiladores - Especificando Sintaxe

Análise Sintática. Fabiano Baldo

Gramáticas Livres de Contexto Parte 1

Linguagens de Domínio Específico

Compiladores - Análise SLR

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. Compiladores Cristina C. Vieira. Compiladores 2012/2013

Compiladores. Fabio Mascarenhas

Compiladores - Análise Recursiva

Compiladores - Análise Recursiva

Análise Sintática Introdução

Compiladores - Análise Léxica

Compiladores - Análise Preditiva

Exemplo preliminar. Considere a linguagem dos Palíndromos Lpal:

Compiladores - Análise LL(1)

Compiladores - Análise LL(1)

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

Conceitos de Linguagens de Programação

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

Compiladores. Análise Sintática

Compiladores - Análise Ascendente

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

Compiladores - Análise Ascendente

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

Linguagens de Programação Aula 4

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

Compiladores - Análise Preditiva

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

Linguagens Livres de Contexto

Análise Sintática LL(1)

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Tratamento dos Erros de Sintaxe. Adriano Maranhão

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Folha 4.1 Análise sintática descendente

Análise Sintática - Final

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

Compiladores - Análise Léxica

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

Compiladores II. Fabio Mascarenhas

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

Linguagens Formais e Autômatos

Compiladores - JACC. Fabio Mascarenhas

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

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

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

MAB Análise Sintática. Wednesday, April 4, 12

Compiladores. Análise Léxica

Tópicos em LP. Fabio Mascarenhas

MAB Análise Sintática. Wednesday, August 31, 11

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

Compiladores Análise Semântica

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

Construção de Compiladores

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

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

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

Linguagens e Gramáticas. Linguagens Formais Hierarquia de Chomsky

Exemplo preliminar. Considere a linguagem dos Palíndromos Lpal:

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

Primeira Prova de Linguagens de Programação - DCC024B -

Capítulo 7. Expressões e Sentenças de Atribuição

Linguagens de Programação

Conceitos de Linguagens de Programação

Compiladores / YACC Professor Ariel da Silva Dias YACC. Adaptação da obra original de Tom Niemann

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

Compiladores. Introdução

Linguagens de Programação. Fluxo de Controle. Carlos Bazilio

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

Analisadores Descendentes Tabulares; Cjs First Follow

Compiladores - Autômatos

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

Compiladores. Análise Sintática

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 32. Instituto de C

Conceitos de Linguagens de Programação

Compiladores Ambiente de Execução

Compiladores Análise Semântica

Compiladores. Parser LL 10/13/2008

I LINGUAGENS E PROCESSADORES: INTRODUÇÃO 1

Linguagens de Programação

Árvores (ordenadas) Departamento de Ciência de Computadores da FCUP MC Aula 11 1

Linguagens de Domínio Específico

Linguagens de Programação

Universidade Federal de Alfenas

Linguagens de Domínio Específico

Universidade Federal do ABC Rua Santa Adélia, Bairro Bangu - Santo André - SP - Brasil CEP Telefone/Fax:

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

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

Linguagem de Programação e Compiladores

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

Aula 8: Gramáticas Livres de Contexto

Análise Sintática Descendente

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.

Transcrição:

Compiladores - Gramáticas Fabio Mascarenhas 2015.2 http://www.dcc.ufrj.br/~fabiom/comp

Ambiguidade Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática De maneira equivalente, se existe mais de uma derivação mais à esquerda para uma cadeia Ou se existe mais de uma derivação mais à direita para uma cadeia As três definições são equivalentes Ambiguidade é ruim para uma linguagem de programação, pois leva a interpretações inconsistentes entre diferentes compiladores

Detectando ambiguidade Infelizmente, não existe um algoritmo para detectar se uma gramática qualquer é ambígua ou não Mas existem heurísticas, a principal delas é verificar se existe uma regra misturando recursão à esquerda e recursão à direita É o caso da gramática de expressões Às vezes isso é bem sutil: ambiguidade do if-else S -> C C -> if exp then C C -> if exp then C else C C -> outros

Removendo ambiguidade Do mesmo modo, não há um algoritmo para remover ambiguidade Se a ambiguidade está na gramática, e não na própria linguagem, o jeito é encontrar a fonte da ambiguidade e reescrever a gramática para eliminá-la No caso de ambiguidade em gramáticas de expressões e operadores, a ambiguidade vem da gramática não estar levando em conta as regras de associatividade e precedência dos operadores Em uma gramática de expressões, cada nível de precedência tem que ganhar seu próprio não-terminal Operadores que devem ser associativos à esquerda precisam usar recursão à esquerda, e associativos à direita precisam de recursão à direita

Expressões simples, sem ambiguidade Assumindo que * tem precedência sobre +, e ambos são associativos à esquerda (ou seja, num + num + num deve ser interpretado como (num + num) + num) S -> E E -> E + T E -> T T -> T * F T -> F F -> ( E ) F -> num

Expressões simples, sem ambiguidade Assumindo que ^ tem precedência sobre * que tem precedência sobre +, ^ é associativo à direita, * e + são associativos à esquerda (ou seja, num + num + num deve ser interpretado como (num + num) + num) S -> E E -> E + T E -> E - T E -> T T -> T * F T -> F F -> A ^ F F -> A A -> ( E ) A -> num

Duas derivações, uma árvore Duas derivações de uma frase podem dar a mesma árvore de uma for mais à esquerda e outra mais à direita S -0-> E -1-> E + E -2-> E * E + E -4-> num * E + E -4-> num * num + E -4-> num * num + num S -0-> E -1-> E + E -4-> E + num -2-> E * E + num -4-> E * num + num -4-> num * num + num

Duas derivações, duas árvores Duas derivações mais à esquerda dão duas árvores diferentes: gramática ambígua S -0-> E -1-> E + E -2-> E * E + E -4-> num * E + E -4-> num * num + E -4-> num * num + num S -0-> E -2-> E * E -4-> num * E -1-> num * E + E -4-> num * num + E -4-> num * num + num

If-else sem ambiguidade Uma solução adotada por diversas linguagens é acrescentar uma delimitador que fecha o if: S -> C C -> if exp then C end C -> if exp then C else C end C -> outros Uma desvantagem é que agora é necessário ter uma construção else-if para ter ifs em cascata sem uma multiplicação de ends E claro, estamos mudando a linguagem!

If-else sem ambiguidade, com a cara de C Uma solução adotada por diversas linguagens é acrescentar uma delimitador que fecha o if: S -> C C -> if exp { C } C -> if exp { C } else { C } C -> outros Uma desvantagem é que agora é necessário ter uma construção else-if para ter ifs em cascata sem uma multiplicação de ends E claro, estamos mudando a linguagem!

If-else sem mudar a linguagem Outra solução é separar os ifs em dois tipos, com não-terminais diferentes: S -> C C -> if exp then C C -> if exp then CE else C C -> outros CE -> if exp then CE else CE CE -> outros Notem a semelhança com a gramática não ambígua de expressões

Quiz Qual a versão não ambígua da gramática: S -> S S S -> a S -> b S -> S a S -> S b S -> S -> S S -> S S -> a S -> b S -> S S S -> a S -> b S -> S a S -> S b S -> a S -> b

Quiz Qual a versão não ambígua da gramática: S -> S S S -> a S -> b S -> S a S -> S b S -> S -> S S -> S S -> a S -> b S -> S S S -> a S -> b * S -> S a S -> S b S -> a S -> b

Quiz Qual a versão não ambígua da gramática: S -> S S S -> a S -> b S -> S S S -> S S -> a S -> b S -> S S S -> S S -> a S -> b

Contornando ambiguidade Na prática, um uso judicioso de ambiguidade pode simplificar a gramática, e deixar ela mais natural Tanto a versão ambígua da gramática de expressões simples quanto a gramática do if-else são mais simples que suas versões não ambíguas! Podemos eliminar a ambiguidade não na gramática, mas na implementação do analisador sintático As ferramentas de geração de analisadores possuem regras de eliminação de ambiguidade, e diretivas de precedência e associatividade que permitem controlar como essa eliminação é feita