A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Tópicos em Compiladores

Cópias: 2
Compiladores Claudio Benossi

Compiladores I Cristiano Damiani Vasconcellos

Apresentações semelhantes


Apresentação em tema: "Tópicos em Compiladores"— Transcrição da apresentação:

1 Tópicos em Compiladores
Cristiano Damiani Vasconcellos

2 Bibliografia Recomendada
COMPILADORES Princípios, Técnicas e Ferramentas; Sethi, Ravi; Aho, Alfred V.; Ullman, Jeffrey D. LTC, 1995. Projeto Moderno de Compiladores; Bal, Henri E.; Grune, Dick; Langendoen, Koen. CAMPUS, 2001. Introdução A Teoria dos Autômatos, Linguagens e Computação; Hopcroft, John E.; Ullman, Jeffrey D.; Motwani, Rajeev. CAMPUS, 2002.

3 Introdução front-end back-end Pré-processador Analisador Léxico
Analisador Sintático Analisador Semântico Gerador de Código (intermediário) Otimizador back-end Gerador de Código

4 Introdução final = (nota1 + nota2) / 2; Analisador Léxico
Id1 = (Id2 + Id3) / 2 Analisador Sintático = Id1 / + Id2 Id3 2 Tabela de Símbolos Id1 final double ... Id2 nota1 Id3 nota2

5 Introdução Analisador Semântico = Id1 / + Id2 Id3 intToDouble(2)
Gerador de Código (intermediário) Tabela de Símbolos Id1 final double ... Id2 nota1 Id3 nota2 temp1 = Id2 + Id3 temp2 = temp1 / 2.0 Id1 = temp2

6 Análise Léxica O Analisador Léxico (scanner) examina o programa fonte caractere por caractere agrupando-os em conjuntos com um significado coletivo (tokens): palavras chave (if, else, while, int, etc), operadores (+, -, *, /, ^, &&, etc), constantes (1, 1.0, ‘a’, 1.0f, etc), literais (“Projeto Mono”), símbolos de pontuação (; , {, }), labels.

7 Análise Léxica constanteInt  digito digito*
constanteDouble  digito digito*. digito* digito  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} X* Representa uma seqüência de zero ou mais X.

8 Análise Sintática Verifica se as frases obedecem as regras sintáticas da linguagem: Por exemplo, uma expressão pode ser definida como: expressão + expressão expressão – expressão (expressão) constante

9 Gramáticas Um conjunto de regras de produção, é um símbolo de partida. Uma regra de produção tem o formato   , onde  representa o nome da construção sintática e  representa uma forma possível dessa construção: <expressão>  <expressão> + <expressão>

10 Gramáticas <expr>  <expr> + <expr>
| <const> <const>  <const><const> | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9

11 Derivação A verificar se uma frase faz parte da linguagem gerada pela gramática, envolve sucessivas substituições da cadeia de símbolos que ocorre do lado esquerdo da produção pela sua construção sintática correspondente, partindo do símbolo inicial. Essa substituição é chamada derivação sendo normalmente denotada pelo símbolo .

12 Derivação ... <expressão>  <expr> + <expr>
 (<expr> - <expr>) + <expr>  (<const> - <expr>) + <expr>  (<const><const> - <expr>) + <expr>  (1<const> - <expr>) + <expr>  (10 - <expr>) + <expr>  (10 - <const>) + <expr> ...  (10 - 2) + 3

13 Árvore Sintática (10 – 2) + 3 <expr> <expr> + <expr>
(<expr>) <const> <expr> - <expr> <const> <const>

14 Gramáticas Ambíguas 10 – 2 + 3 <expr> <expr>
<expr> <expr> <expr> <expr> + <expr>

15 Gramáticas <expr>  <expr> + <termo>
<termo>  (<expr>) | <const> <expr> <expr> + <termo> <expr> - <termo> + <termo> <termo> - <termo> + <termo> 10 – 2 + 3 <expr> <expr> <termo> <expr> - <termo>

16 Gramáticas <expr>  <expr> + <termo>
<termo>  <termo> * <fator> | <termo> / <fator> | <fator> <fator>  (<expr>) | <const> <expr> 1 + 2 * 3 <expr> <termo> <termo> * <fator>

17 Gramáticas <expr>  <expr> + <termo>
<termo>  <termo> * <fator> | <termo> / <fator> | <fator> <fator>  (<expr>) | <const> 1 + 2 * 3 <expr> <termo> <termo> * <fator>

18 Tradução Dirigida pela Sintaxe
Programa Fonte Analisador Léxico Tabela de Símbolos ... token Solicita token Analisador Sintático Analisador Semântico Código Intermediário

19 Gramáticas - Exercícios
Considerando a gramática apresentada anteriormente derive as expressões e apresente a árvore sintática correspondente: (1 + 2) * (1 – 2) + 3 * 4 Altere a gramática para incluir o operador unário -, esse operador deve ter precedência maior que os outros operadores. Altere a gramática para que os operadores de adição, subtração, multiplicação e divisão tenham associatividade da direita para a esquerda. Defina uma gramática para expressões aritméticas (operadores +, -, *, /) pós fixadas .

20 Gramáticas Dados 2 conjuntos independentes de símbolos:
Vt – Símbolos terminais Vn – Símbolos não terminais. Uma gramática é definida como a quádrupla: {Vn, Vt, S, P} Onde, S  Vn é o símbolo inicial da gramática. P é um conjunto de regras de reescrita na forma:   , sendo:   (Vn  Vt)* Vn (Vn  Vt)*   (Vn  Vt)*

21 Classificação de Gramáticas
Irrestritas – nenhuma restrição é imposta Sensíveis ao Contexto - ||  || Livres de Contexto -   Vn   (Vn  Vt)+ Regulares -   Vn  tem a forma a ou aB, onde a  Vt e B  Vn

22 Gramáticas Regulares C  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9
| 0C | 1C | 2C | 3C | 4C | 5C | 7C | 8C | 9C C  CC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 C  digito digito* digito  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

23 Especificação Análise Léxica – expressões regulares
Análise Sintática – gramáticas livre de contexto. Análise Semântica – sistema de tipos (regras de inferência), semântica denotacional, semântica operacional, semântica de ações. Geração/Otimização de Código – linguagens para descrição de arquiteturas.

24 Linguagens Regulares Gerada a partir de uma gramática regular.
Pode ser representada através de uma expressão regular. Pode ser reconhecida por um Autômato Finito. Considerando linguagens compostas por símbolos 0 e 1 podemos afirmar: a linguagem L01 ={0n1n| n  1} não é regular; a linguagem L01 ={0n1m | n  1, m  1} é regular;

25 Expressões Regulares Maneira compacta de representar linguagens regulares. É composta de 3 operações, sendo e1 e e2 expressões geradas por duas linguagens regulares L1 e L2 respectivamente Concatenação: e1e2 = { xy | x  L1 e y  L2} Alternação: e1|e2 = { x | x  L1 ou x  L2} Fechamento: e1* = zero ou mais ocorrências de e1. É definida a precedência desses operadores como sendo: fechamento, concatenação, alternação (da maior precedência para a menor).

26 Expressões Regulares Exemplos:
identificador  (letra | _) (letra | digito | _)* letra  a | b | ... | A | B | ... digito  0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 constInt  digito digito* constDouble  digito digito*.digito* | . digito digito*

27 Autômato Finito A linguagem gerada por uma gramática regular pode ser reconhecida por um autômato finito. Um autômato finito consiste em: Um conjunto finito de estados. Um conjunto finito de símbolos de entrada (alfabeto). Uma função de transição que tem como argumentos um estado e um símbolo de entrada e retorna a um estado. Um estado inicial. Um conjunto de estados finais também chamados estados de aceitação.

28 Autômato Finito . letra | digito | _ letra | _ letra | digito | _

29 Autômato Finito letra | digito | _ letra | _ f o r
AFN – Autômato Finito Não Determinista letra | digito | _ letra | _ AFD – Autômato Finito Determinista ld ld ld f o r Onde ld representa letra | digito | _ (com exceção da letra que faz a transição para outro estado).

30 Autômato Finito Implementação
letra | digito | _ letra | _ 1 digito digito 2

31 Geradores de Analisadores Léxicos
delim [ \t] ws {delim}+ letra [A-Za-z] digito [0-9] id {letra}({letra}|{digito})* int {digito}+ real {digito}+\.{digito}*(E[+-]?{digito}+)? char '{letra}' string '({letra}|{digito}|[ \t\\:])*' %% {char} {yylval.ptr=insereTab(&TabSimb[0], yytext);return TCCHARACTER;} {string} {yylval.ptr=insereTab(&TabSimb[0], yytext);return TCSTRING;} \n {num_linhas++;} FUNCTION {return TFUNCTION;} INTEGER {return TINTEGER;} ARRAY {return TARRAY;} IF {return TIF;} {id} {yylval.ptr=instalar(yytext); return TID;} "<" {return TMENOR;}

32 Análise Léxica - Exercícios
Escreva uma gramática, expressão regular e AFD que defina os números binários terminados em zero. Mostre uma expressão regular e o AFD correspondente a gramática abaixo: S  aS B  bC C  aC | aB | a Escreva uma expressão regular para as constantes double da linguagem C. Dica pode-se usar o símbolo  para indicar uma “cadeia” vazia.


Carregar ppt "Tópicos em Compiladores"

Apresentações semelhantes


Anúncios Google