Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Traduções Dirigidas por Sintaxe
“E o segundo é semelhante a ele: ‘Ame ao próximo como a si mesmo’. Destes dois mandamentos dependem toda a Lei e os profetas.” (Mateus 22:39-40)
2
Etapas da Compilação Front-End (Análise) Back-End (Síntese)
Análise Léxica Análise Sintática Analise Semântica Geração de Código Intermediário Final Front-End (Análise) Back-End (Síntese)
3
Sumário Introdução Definição Dirigida por Sintaxe Esquema de Tradução
4
1. Introdução
5
Traduções Dirigidas por Sintaxe
As produções de uma gramática são suas “regras sintáticas” Traduções Dirigidas por Sintaxe associam regras semânticas a cada uma dessas regras sintáticas, com algum objetivo Regra sintática → Regra semântica
6
Exemplo
7
Traduções Dirigidas por Sintaxe
Possíveis aplicações Criação da árvore sintática em memória Verificação de tipos Geração de código intermediário Etc. Enfim, ela pode ser usada em todo o restante das etapas do front-end...
8
Traduções Dirigidas por Sintaxe
Existem dois tipos Definição Dirigida por Sintaxe – cada nó da árvore possui atributos, e as regras semânticas definem os valores que eles devem receber Esquemas de Tradução – associam código qualquer a cada produção, para ser executado durante a análise sintática (parsing) A distinção é um pouco confusa...
9
Traduções Dirigidas por Sintaxe
“Definição Dirigida por Sintaxe” é uma descrição mais abstrata e formal de uma tradução Especifica a tradução Já um “Esquema de Tradução” é a descrição concreta do código que vai ser executado para cada produção Projeta a implementação de uma definição dirigida por sintaxe
10
2. Definição Dirigida por Sintaxe
11
Definição Dirigida por Sintaxe
É a gramática da linguagem acrescida de: Descrição dos atributos que cada símbolo (terminal ou não-terminal) possui Regras semânticas, associadas a cada produção, para definir os valores dos atributos Chamaremos de DDS, apesar de, em inglês, a sigla ser SDD (Syntax-Directed Definition)
12
Exemplo 1 Com base em uma gramática de expressões, o objetivo do exemplo é avaliar o valor numérico das expressões Para os não-terminais L, E, T e F, vamos considerar que possuem o atributo “val” O símbolo terminal digit terá um atributo “lexval”, com o seu valor numérico O símbolo terminal ; (ponto-e-vírgula) não tem importância nesta tradução
13
Exemplo 1 Produção Regra Semântica L → E ; E → T + E1 E → T T → F * T1
L.val = E.val E → T + E1 E.val = T.val + E1.val E → T E.val = T.val T → F * T1 T.val = F.val * T1.val T → F T.val = F.val F → digit F.val = digit.lexval
14
Exemplo 2 Este exemplo usa uma gramática de expressões com soma e subtração apenas O objetivo da DDS neste exemplo é construir a árvore sintática Cada não-terminal tem um atributo “node” que representa o nó da árvore que representa aquela ocorrência do não-terminal
15
Exemplo 2 Produção Regra Semântica E → E1 + T E → E1 - T E → T
E.node = new Op(‘+’, E1.node, T.node) E → E1 - T E.node = new Op(‘-’, E1.node, T.node) E → T E.node = T.node T → ( E ) T.node = E.node T → num T.node = new Leaf(num) T → identifier T.node = new Leaf(identifier)
16
Definição Dirigida por Sintaxe
Não se preocupa com detalhes, como a ordem de definição dos atributos Sua principal aplicação é para especificar traduções mais simples Mais abstrata
17
3. Esquema de Tradução
18
Esquema de Tradução É uma extensão do conceito de DDS
Possui trechos de código como regras semânticas (que passam a ser chamadas ações semânticas) Controla a ordem de execução das ações semânticas Implementação da tradução (ou da DDS) Mais concreta
19
Esquema de Tradução Assim, um Esquema de Tradução é uma gramática acrescida de: Descrição dos atributos que cada símbolo (terminal ou não-terminal) possui Ações semânticas, associadas a cada produção Descritas na forma de trechos de código de uma linguagem de programação real Posicionadas dentro da produção como se fossem um símbolo, para indicar o momento exato de executar a ação
20
Exemplo 3 Exemplo 5.18 do livro do dragão (2ª edição)
Parecida com a gramática do Exemplo 1 (avalia expressões) Porém, entenda as regras como código Ao final, imprime o resultado
21
Exemplo 3
22
Exemplo 4
23
Exemplo 4 Indique qual seria a saída para esta entrada (que pode ser reconhecida sem ambiguidade): 2 + (3 * 4)
24
Sobre os Exemplos 3 e 4 Todas as ações vêm no final da produção
Porém, em alguns casos, as ações precisam vir no meio da produção
25
Exemplo 5 Exemplo 5.21 do livro
O objetivo deste Esquema de Tradução é imprimir traduzir expressões para a notação prefixada Exemplo: traduz de “1+2*3” para “+1*23” Não-terminais sem atributos
26
Exemplo 5
27
Ordem das Ações Nesta gramática, algumas ações vêm no início das produções Para garantir imprimir na forma prefixada Como entender a ordem em que as ações são disparadas? Montar a árvore, tratando as ações como símbolos!
28
Exemplo 5: Árvore Exemplo de árvore para a entrada “3*5+4”
29
Exemplo 5: Execução Para executar, “visitar” cada nó examinando seus filhos da esquerda para a direita Quando for uma ação, executa-a Quando for outro nó, prossegue recursivamente Saída (console) para o caso anterior (3*5+4): + * 3 5 4
30
Exemplo 5: Exercício Qual a saída gerada para a entrada “1*2+3” ?
Desenhar a árvore Executar Mostrar a saída que seria impressa no console
31
Implementando um Esquema de Tradução
Se você for implementar um pequeno “compilador” baseado em um dos Esquemas de Tradução deste slide, como você faria? Quais formas de implementar ? Discutir...
32
Implementando um Esquema de Tradução
Os exemplos apresentados devem ter sugerido a você duas formas de implementar: Durante a análise sintática Por meio da criação de uma árvore sintática
33
1. Durante a Análise Sintática
O parser vai intercalar ações de reconhecimento sintático, com ações semânticas Durante reconhecimento de uma produção, Quando o parser chega no ponto onde a ação foi posicionada (exemplo: após certo símbolo, etc.) Ele dispara a ação semântica desejada Ação hard-coded no parser... Depois, prossegue o reconhecimento...
34
1. Durante a Análise Sintática
Nem sempre é possível implementar um Esquema de Tradução durante a análise sintática O exemplo 5 é um desses casos As ações das produções 2 e 4 precisam ser executadas antes do parser identificar qual a produção ele vai reconhecer
35
2. Na Árvore Sintática Primeiro, a árvore é construída
Por um Esquema de Tradução no parser Criar funções que visitam os nós da árvore Nelas, estarão “hard-coded” as ações semânticas Depois de criada a árvore, o Esquema de Tradução é disparado chamando a função que visita a raiz (símbolo inicial)
36
2. Na Ávore Sintática Funções para visitar cada nó
Disparam sucessivamente novas visitas aos filhos deste nó, da esquerda para a direita Porém, no lugar onde o Esquema de Tradução prevê uma ação semântica, ao invés de visitar o próximo filho, a função vai executar a ação Rever o exemplo 5
37
Análise Vantagens de fazer na Análise Sintática:
Análise Sintática e Esquema de Tradução feitos percorrendo 1 vez apenas o código de entrada Vantagens de fazer na Árvore: Permite disparar ações posicionadas em qualquer lugar da produção (ex.: no início) É possível implementar diferentes Esquemas de Tradução, de forma mais modularizada Ex.: um para verificação semântica, outro para geração de código intermediário, etc.
38
Conclusão Dois tipos de Traduções Dirigidas por Sintaxe:
Definição Dirigida por Sintaxe definição mais abstrata serve para especificar Esquema de Tradução definição mais concreta (ação = código) serve para projetar a implementação Veremos mais detalhes de implementação de Esquemas de Tradução na próxima aula
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.