tópicos em compiladores cristiano damiani vasconcellos [email protected]
TRANSCRIPT
![Page 2: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/2.jpg)
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.
![Page 3: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/3.jpg)
Introdução
Pré-processador
Analisador Léxico
Analisador Sintático
Analisador Semântico
Gerador de Código(intermediário)
Otimizador
Gerador de Código
front-end
back-end
![Page 4: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/4.jpg)
Introdução
final = (nota1 + nota2) / 2;
Analisador Léxico
Id1 = (Id2 + Id3) / 2
Analisador Sintático
=
Id1 /
+
Id2 Id3
2
Id1 final double ...
Id2 nota1 double ...
Id3 nota2 double ...
...
Tabela de Símbolos
![Page 5: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/5.jpg)
Introdução
=
Id1 /
+
Id2 Id3
intToDouble(2)
Id1 final double ...
Id2 nota1 double ...
Id3 nota2 double ...
...
Tabela de Símbolos
Analisador Semântico
temp1 = Id2 + Id3
temp2 = temp1 / 2.0
Id1 = temp2
Gerador de Código(intermediário)
![Page 6: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/6.jpg)
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.
![Page 7: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/7.jpg)
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.
![Page 8: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/8.jpg)
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ãoexpressão – expressão(expressão)constante
![Page 9: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/9.jpg)
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>
![Page 10: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/10.jpg)
Gramáticas
<expr> <expr> + <expr>| <expr> – <expr>| (<expr>)| <const>
<const> <const><const>| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9
![Page 11: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/11.jpg)
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 .
![Page 12: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/12.jpg)
Derivação
(10 - 2) + 3
<expressão>
<expr> + <expr> (<expr>) + <expr> (<expr> - <expr>) + <expr> (<const> - <expr>) + <expr> (<const><const> - <expr>) + <expr> (1<const> - <expr>) + <expr> (10 - <expr>) + <expr> (10 - <const>) + <expr>...
![Page 13: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/13.jpg)
Árvore Sintática
<expr>
<expr> + <expr>
(<expr>) <const>
<expr> - <expr>
<const> <const>
10 2 3
(10 – 2) + 3
![Page 14: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/14.jpg)
Gramáticas Ambíguas
10 – 2 + 3
<expr> - <expr>
<expr>
<expr> + <expr>
10 2 3
<expr>
<expr> + <expr>
<expr> - <expr>
10 2 3
![Page 15: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/15.jpg)
Gramáticas
<expr> <expr> + <termo>
| <expr> - <termo>
| <termo>
<termo> (<expr>)
| <const>
<expr> <expr> + <termo> <expr> - <termo> + <termo> <termo> - <termo> + <termo> 10 – 2 + 3
<expr>
<expr> + <termo>
<expr> - <termo>
10 2 3
![Page 16: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/16.jpg)
Gramáticas
<expr> <expr> + <termo>
| <expr> - <termo>
| <termo>
<termo> <termo> * <fator>
| <termo> / <fator>
| <fator>
<fator> (<expr>)
| <const>
<expr> + <termo>
<termo> * <fator>
3 2 3
<expr>
1 + 2 * 3
![Page 17: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/17.jpg)
Gramáticas
<expr> <expr> + <termo>
| <expr> - <termo>
| <termo>
<termo> <termo> * <fator>
| <termo> / <fator>
| <fator>
<fator> (<expr>)
| <const>
<termo>
<termo> * <fator>
<expr>
1 + 2 * 3
![Page 18: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/18.jpg)
Tradução Dirigida pela Sintaxe
Analisador Sintático
Analisador Léxico
Analisador Semântico
Tabela de Símbolos
...
Programa Fonte
Código Intermediário
Solicita tokentoken
![Page 19: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/19.jpg)
Gramáticas - Exercícios
1. Considerando a gramática apresentada anteriormente derive as expressões e apresente a árvore sintática correspondente:(1 + 2) * 3 (1 – 2) + 3 * 4
2. Altere a gramática para incluir o operador unário -, esse operador deve ter precedência maior que os outros operadores.
3. 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.
4. Defina uma gramática para expressões aritméticas (operadores +, -, *, /) pós fixadas .
![Page 20: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/20.jpg)
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)*
![Page 21: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/21.jpg)
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
![Page 22: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/22.jpg)
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
![Page 23: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/23.jpg)
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.
![Page 24: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/24.jpg)
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;
![Page 25: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/25.jpg)
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).
![Page 26: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/26.jpg)
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*
![Page 27: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/27.jpg)
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:
1. Um conjunto finito de estados.
2. Um conjunto finito de símbolos de entrada (alfabeto).
3. Uma função de transição que tem como argumentos um estado e um símbolo de entrada e retorna a um estado.
4. Um estado inicial.
5. Um conjunto de estados finais também chamados estados de aceitação.
![Page 28: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/28.jpg)
Autômato Finito
letra | digito | _
letra | _
letra | digito | _
letra | _
.
.
digitodigito
digito digito
![Page 29: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/29.jpg)
Autômato Finito
letra | digito | _
letra | _
f
o r
letra | digito | _
letra | _
fo r
ldld
ld
Onde ld representa letra | digito | _ (com exceção da letra que faz a transição para outro estado).
AFD – Autômato Finito Determinista
AFN – Autômato Finito Não Determinista
![Page 30: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/30.jpg)
Autômato Finito Implementação
letra | digito | _
letra | _
digito
digito
0 1
2
![Page 31: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/31.jpg)
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;}
![Page 32: Tópicos em Compiladores Cristiano Damiani Vasconcellos damiani@ppgia.pucpr.br](https://reader033.vdocuments.mx/reader033/viewer/2022052618/552fc0f9497959413d8b727e/html5/thumbnails/32.jpg)
Análise Léxica - Exercícios
1. Escreva uma gramática, expressão regular e AFD que defina os números binários terminados em zero.
2. Mostre uma expressão regular e o AFD correspondente a gramática abaixo:S aS B bC C aC | aB | a
3. Escreva uma expressão regular para as constantes double da linguagem C.
Dica pode-se usar o símbolo para indicar uma “cadeia” vazia.