Escolar Documentos
Profissional Documentos
Cultura Documentos
by Bart Simpson
2011
Sumario
1 Livros 2
2 Introducao 2
4 Analise 4
5 Analise lexica 5
5.1 Lex e Flex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
6 Estruturas basicas 5
6.1 Deteccao de erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6.2 Fases do compilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6.3 Em tempo de compilacao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
6.4 Em tempo de execucao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
7 Diagramas de execucao 7
7.1 Referencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
8 MEPA 7
8.1 Introducao a MEPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
8.2 Instrucoes basicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
8.2.1 exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
8.3 Comandos de decisao e repeticao . . . . . . . . . . . . . . . . . . . . . . . . . . 9
8.3.1 IF e THEN c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
8.3.2 WHILE e do c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
8.3.3 IF e THEN c1 ELSE c2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
10 Tabela de smbolos 9
13 Analise sintatica 10
13.1 Yacc e Bison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1
14 Analise sintatica descendente 11
21 Diagramas sintaticos 11
23 Integracao Lex/Flex-Yacc/Bison 11
26 Ambiguidade 11
27 Construcao de tabelas LR 11
29 Analise semantica 11
30 Tabela de smbolos 11
32 Geracao de codigo 12
32.1 Codigo intermediario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
32.2 Codigo objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Lista de Tabelas
Lista de Figuras
1 Analise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 Analise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3 Fases do compilador . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4 Instrucoes MEPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5 Codigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
6 Arvore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2
7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
8 Arvore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
9 Sequencia de codigo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3
1 Livros
livro do dragao(AHO...); Compiladores, principios, tecnicas e ferramentas (2007);
2 Introducao
Um COMPILADOR e um programa que le um programa escrito numa linguagem - a lingua-
gem fonte - e o traduz num programa equivalente numa outra linguagem - a linguagem objeto,
relatando ao usuario a presenca de erros no programa fonte.
ANALISE: Divide o programa fonte nas partes constituintes e cria uma representacao
intermediaria;
Durante a analise, as operacoes implicadas pelo programa fonte sao determinadas e regis-
tradas numa estrutura hierarquica, chamada de arvore (ex.: Arvore Sintatica).
Figura 1: Analise
4
3.1 Ferramentas que manipulam programas fontes
Editores de estruturas: Recebe como entrada um conjunto de comandos para construir
um programa fonte. Estabelece uma estrutura hierarquica apropiada.
Pretty printers: Analisa um programa e o imprime numa forma em que a sua estrutura
se torne claramente visvel.
5
4 Analise
A analise compreende em tres fases:
Figura 2: Analise
6
5 Analise lexica
Nesta fase o arquivo de entrada e varrido caractere a caractere;
Smbolos especiais (espaco em branco, smbolos de pontuacao e new line) sao utilizados
para estabelecer os limites das palavras;
Identificacao de erros lexicos (overflowde campo numerico, uso de smbolos nao perten-
centes ao alfabeto da linguagem).
Lex: Gerador de analisadores lexicos (UNIX - Ex.: Lex AT&T, Berkeley BSD)
Entrada e sada:
6 Estruturas basicas
Um programa fonte pode conter diversos modulos armazenados em arquivos diferentes. A
coleta desses modulos e feita pelo pre-processador. Alem disso, o pre-processador pode expandir
formas curtas (ex.: macros).
O contexto de um compilador:
7
Figura 3: Fases do compilador
3. Pre-processadores racionais. Expandem linguagens mais antigas com features novas. Por
exemplo uma linguagem que nao possui WHILE, passa ter uma estrutura que e entendida
como um WHILE.
4. Extensores de linguagem. Tenta conferir maior poder a uma linguagem. Por exemplo
utilizar uma instrucao Python dentro de um programa em C. Essa instrucao e traduzida
para C;
8
Imagine um programa do tipo: a <- b + c*10
Fases:
Analisador sintatico (gramatical). Gera uma estrutura hierarquica com o fluxo dos tokens
(arvores sintaticas). Na raz teramos a atribuicao. O filho esquerdo contem id1 e o filho
direito contem o somador dos filhos id2 (filho esquerdo) com o resultado da multiplicacao
do nvel 3 da arvore. No nvel 3 temos a id3 como filho esquerdo e 10 como filho direito.
Desenhe essa arvore, fica mais facil de entender.
Analise semantica.
7 Diagramas de execucao
7.1 Referencias
Livro do Tomasz, captulos:
8 MEPA
8.1 Introducao a MEPA
8.2 Instrucoes basicas
Instrucoes do apendice 3 (A,B) do livro do Thomasz (recebe na 1a prova e na final).
Veja a Figura 8.2:
9
Figura 4: Instrucoes MEPA
8.2.1 exemplo
Equacao:
A+(B DIV 9 -3)*C
a=0,0; b=0,1; c=0,2
CRVL 0,0 (carrega valor 0 em) CRVL 0,1 (carrega valor 1 em) CRCT 9 (carrega constante
9) DIVI (dividir) CRCT 3 (carrega constante 3) SUBT (subtrai) CRVL 0,2 (carrega 2 em)
10
MULT (multiplica) SOMA (soma)
DSVF l
traducao de c
l: nada
8.3.2 WHILE e do c
l1: nada
traducao de e
DSVF l2:
traducao de c
DSVS l1
l2: nada
DSVF l1
traducao de c1
DSVS l2
l1: nada
traducao de c2
l2: nada
Uma tabela de smbolos e uma estrutura de dados contendo um registro para cada iden-
tificador, com os campos contendo os atributos do identificador.
11
11 Passagem de parametros por valor e por referencia,
Funcoes
12 Rotulos e desvios incondicionais
13 Analise sintatica
E responsavel pela verificacao da bem formacao dos comandos da linguagem, de acordo
com as regras especificadas pela gramatica da linguagem;
Uma arvore sintatica e uma representacao compactada de uma arvore PARSE na qual os
operadores aparecem como nos interiores e os operandos de um operador sao os filhos do
no daquele operador;
12
13.1 Yacc e Bison
30 Tabela de smbolos
Uma funcao essencial do compilador e registrar os identificadores usados no programa
fonte e coletar as informacoes sobre os seus diversos atributos de um identificador, tais
como: memoria alocada, tipo, escopo).
13
Uma tabela de smbolos e uma estrutura de dados contendo um registro para cada iden-
tificador, com os campos contendo os atributos do identificador.
Esse codigo pode, eventualmente, ser o codigo objeto final mas, na maioria das vezes,
constitui-se num codigo intermediario, pois a traducao de codigo fonte para objeto em
mais de um passo apresenta algumas vantagens: possibilita a otimizacao de codigo inter-
mediario, de modo a obter-se o codigo objeto final mais eficiente;
A geracao de codigo intermediario pode estar estruturalmente distribuda nas fases anteriores
(analise sintatica e semantica) ou mesmo nao existir (traducao direta para codigo objeto), no
caso de tradutores bem simples. A grande diferenca entre o codigo intermediario e o
codigo objeto final e que o intermediario nao especifica detalhes tais como quais
registradores serao usados, quais enderecos de memoria serao referenciados, etc.
14
Exemplo de codigo intermediario:
Figura 5: Codigo
Figura 6: Arvore
Depois das analises sintatica e semantica do programa fonte, muitos compiladores ge-
ram uma representacao intermediaria explcita de baixo nvel ou do tipo linguagem de
maquina, que podemos imaginar como um programa para uma maquina abstrata.
15
Essa representacao intermediaria deve ter duas propriedades importantes: ser facilmente
produzida e ser facilmente traduzida para a maquina alvo.
Consideramos uma forma intermediaria, chamada codigo de tres enderecos, que consiste
em uma sequencia de instrucoes do tipo assembler com tres operandos por instrucao.
16
Figura 7:
17
Figura 8: Arvore
18
Varios pontos precisam ser observados em relacao aos codigos de tres enderecos:
Segundo, o compilador precisa gerar um nome temporario para guardar o valor computado
por uma instrucao de tres enderecos;
Em nosso exemplo, precisamos decidir como armazenar inteiros para gerar o codigo de
indexacao de matrizes.
Por exemplo, uma sequencia de codigo possvel para a expressao dada poderia ser (em uma
linguagem de montagem hipotetica):
19
O primeiro operando de cada uma das instrucoes especifica um destino;
O F em cada uma das instrucoes nos diz que ela manipula numeros de ponto flutuante;
O codigo em (1.5) carrega o conteudo do endereco id3 no registrador R2, depois o multi-
plica pela constante de ponto flutuante 60.0;
O # significa que o valor 60.0 deve ser tratado como uma constante imediata;
A terceira instrucao move id2 para o registrador R1, e a quarta o soma com o valor
previamente calculado no registrador R2;
Esta discussao sobre geracao de codigo ignorou a importante questao relativa a alocacao
de espaco na memoria para os identificadores do programa fonte;
Decisoes sobre a alocacao de espaco podem ser tomadas em dois momentos: durante a
geracao de codigo intermediario ou durante a geracao do codigo.
20