Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.

Post on 07-Apr-2016

241 views 5 download

Transcript of Faculdade Pernambuca - FAPE Compiladores Abril/2007 Compiladores Abril/2007.

Faculdade Pernambuca - FAPE

Compiladores

Abril/2007

Conceitos

Uma linguagem de programação pode ser definida pela descrição da aparência de seus programas (sintaxe) e do que os mesmos significam (semântica).

Para especificar a sintaxe da linguagem usamos gramáticas livres de contexto (gramática).

Ela também é usada para guiar a tradução de programas.– A compilação orientada por gramática é conhecida

como tradução dirigida pela sintaxe.

Conceitos

Analisador Léxico

TradutorDirigido pela

Sintaxe

Fluxo de Caracteres de entrada

Fluxo de Tokens

Representação Intermediária

Estrutura da Vanguarda de nosso Compilador

Conceitos

Definição da Sintaxe Uma gramática descreve naturalmente a

estrutura hierárquica de muitas construções das linguagens de programação. Exemplo de if-else em C:

comando em C: if (expressão) comando else comando

Regra de produção: cmd -> if (expr) cmd else cmd

( -> significa poder ter a forma ou produz)

Conceitos

Definição da Sintaxe

If-else ( ) – são tokensExpr e cmd – Representam sequências de tokens e são

chamados não terminais.

Uma gramática livre de contexto possui quatro componentes:– Um conjunto de tokens, conhecidos como símbolos

terminais.– Um conjunto de não-terminais.– Um conjunto de produções– Uma designação a um dos não-terminais como o

símbolo de partida.

Conceitos

Definição da Sintaxe Produções consistem em um não-terminal,

chamado de lado esquerdo da produção, uma seta e uma sequência de tokens e/ou não terminais, chamados de lado direito da produção.

As gramáticas são especificadas pela listagem de suas produções onde a primeira contém o símbolo de partida.

Assumimos que dígitos, sinas (<=, >=, +, - , etc), palavras reservadas sejam terminais.

Conceitos

Definição da Sintaxe

As produções com o mesmo não terminal a esquerda podem ser agrupadas. Exemplo:

digito -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Exemplo 1:

Gramática para descrever uma lista de dígitos separados por sinais de mais ou de menos.

Conceitos

Definição da Sintaxe

Produções:

lista -> lista + dígito | lista – dígito | dígitodigito -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Tokens: + - 0 1 2 ... 9Terminais: 0 1 2 ... 9Não Terminais: lista e dígito

Uma cadeia de tokens é uma sequência de 0 ou mais tokens.

Conceitos

Definição da Sintaxe

Uma gramática deriva cadeias começando pelo símbolo de partida. As cadeias de tokens geradas formam a linguagem definida pela gramática.

Exemplo de cadeia: 9 – 5 + 2 Pela gramática anterior temos:

a) 9 é uma lista.b) 9 – 5 é uma lista.c) 9 – 5 + 2 é uma lista.

Conceitos

Exemplo 2:

Sequencia de comandos, separados por ponto e vírgula, encontrada nos blocos bengin-end de Pascal.

Blocl -> begin cmds_opcs endcmds_opcs -> lista_cmds | Elista_cmds -> lista_cmds; cmd | cmd

Conceitos

Árvores Gramaticais

Uma árvore gramatical mostra como o símbolo de partida de uma gramática deriva uma cadeia de uma linguagem.

Se um não terminal A possui uma produção A -> XYZ, então uma árvore pode ter um nó A com três filhos.

A / | \

X Y Z

Conceitos

Árvores Gramaticais

Formalmente, dada uma gramática livre de contexto, uma árvore gramatical possui as seguintes propriedades:– A raiz é rotulada pelo símbolo de partida.– Cada folha é rotulada por um token ou por E.– Cada nó interior é rotulado por um não-terminal.– Se A é um não-terminal rotulando algum nó interior e

X1, x2, ... , Xn são os rótulos dos seus filhos, então A ->X1X2,..,Xn é uma produção.

Conceitos

Árvores Gramaticais

lista

lista dígito

lista dígito

dígito 9 - 5 + 2

Árvore gramaticalpara 9 – 5 + 2

Conceitos

Árvores Gramaticais

Na árvore anterior temos:lista – Raiz é rotulada lista (símbolo de partida).lista + dígito – Filhos da raíz.lista -> lista + dígito é uma produção na gramática.

As folhas da árvore gramatical, lidas da esquerda para a direita formam o produto da árvore, que é a cadeia gerada ou derivada a partir do não-terminal à raiz da árvore gramatical.

Conceitos

Árvores Gramaticais

Outra definição da linguagem gerada por uma gramática é a de um conjunto de cadeias que podem ser representadas por alguma árvore gramatical.

O processo de encontrar uma árvore gramatical para uma dada cadeia de tokens é chamado de análise gramatical ou análise sintática daquela cadeia.

Conceitos

Ambigüidade

É importante observar que uma gramática pode ter mais de uma árvore gramatical gerando uma dada cadeia de tokens. Tal gramática é dita ambígua.

Exemplo: basta encontrar uma cadeia de tokens que tenha mais de uma árvore gramatical.

Conceitos

Ambigüidade

Gramática ambígua:

Cadeia -> cadeia + cadeia | cadeia – cadeia | cadeiaCadeia -> 0 | 1 | ... | 9

Ver exemplos:

Precisamos resolver a ambigüidade das gramáticas!

Conceitos

Ambigüidade

cadeia cadeia

cadeia + cadeia cadeia - cadeia

cadeia - cadeia cadeia + cadeia

9 5

2 9

5 2

Duas Árvores Gramaticais para 9-5+2

Conceitos

Associatividade dos Operadores

Convencionalmente, 9+5+2 é equivalente a (9+5)+2 e 9-5-2 a (9-5)-2. Na maioria das linguagens os operadores +, -, * e / são

associados à esquerda. Exponenciação tem associação à direita. Em C o

operador de atribuição tem associação à direita também

direita -> letra = direita | letraletra -> a | b | ... | z

Conceitos

Associatividade dos Operadores

Exemplo: a=b=c e 9 – 5 – 2

direita lista letra = direita lista - digito

a letra = direita lista - digito

letra digitob

c 9

5

2

Árvore gramatical para operadores associativos à esquerda e à direita

Precedência de Operadores

Para a expressão 9+5*2 existem duas possíveis interpretações para a mesma (9+5)*2 ou 9+(5*2)

* e / tem precedência mais alta que + e –

Sintaxe das expressões

Expr -> expr + termo | expr – termo | termoTermo -> termo * fator | termo/fator | fator Fator -> digito | (expr)

Precedência de Operadores

Sintaxe dos comandos

cmd -> id := expr | if expr then cmd | if expr then cmd else cmd | while expr do cmd | begin cmds_opcs end