E N D
1. Compiladores
Cristiano Damiani Vasconcellos
damiani@joinville.udesc.br
2. Bibliografia Recomendada
3. Introduo(Construo de um Executvel)
4. Introduo(Fases de um Compilador)
5. Introduo
6. Introduo
7. Anlise Lxica O Analisador Lxico (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, etc),
smbolos de pontuao (; , {, }, etc),
labels.
8. Anlise Lxica constanteInt ? digito digito*
constanteDouble ? digito digito*. digito*
digito ? {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
9. Anlise Sinttica Verifica se as frases obedecem as regras sintticas da linguagem:
Por exemplo, uma expresso pode ser definida como:
expresso + expresso
expresso expresso
(expresso)
constante
10. Gramticas Livres de Contexto Definidas por uma qudrupla (VN, VT, S, P), onde:
VN um conjunto de smbolos no terminais (representam as construes sintticas da linguagem).
VT um conjunto de smbolos terminais (tokens da linguagem).
S ? VN o smbolo inicial da gramtica.
P um conjunto de regras de produo, pares ordenados representados na forma ? ? ?, onde ? ? VN e ? ? (VN ? VT)*.
11. Gramticas Livres de Contexto <expr> ? <expr> + <expr>
| <expr> <expr>
| (<expr>)
| <const>
<const> ? <const><const>
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9
12. Derivao Verificar se uma frase faz parte da linguagem gerada pela gramtica, envolve sucessivas substituies dos smbolos que ocorrem do lado esquerdo da produo pela sua construo sinttica correspondente.
Essa substituio chamada derivao sendo normalmente denotada pelo smbolo ?. E deve iniciar a partir do smbolo inicial da gramtica.
13. Derivao
14. rvore de Derivao
15. Gramticas Ambguas
16. Gramticas <expr> ? <expr> + <termo>
| <expr> - <termo>
| <termo>
<termo> ? (<expr>)
| <const>
<expr>
<expr> + <termo>
<expr> - <termo> + <termo>
<termo> - <termo> + <termo>
10 2 + 3
17. Gramticas <expr> ? <expr> + <termo>
| <expr> - <termo>
| <termo>
<termo> ? <termo> * <fator>
| <termo> / <fator>
| <fator>
<fator> ? (<expr>)
| <const>
18. Gramticas <expr> ? <expr> + <termo>
| <expr> - <termo>
| <termo>
<termo> ? <termo> * <fator>
| <termo> / <fator>
| <fator>
<fator> ? (<expr>)
| <const>
19. Traduo Dirigida pela Sintaxe
20. Gramticas - Exerccios Considerando a gramtica apresentada anteriormente derive as expresses e apresente a rvore sinttica correspondente:(1 + 2) * 3 (1 2) + 3 * 4
Altere a gramtica para incluir o operador unrio -, esse operador deve ter precedncia maior que todos os outros operadores.
Altere a gramtica para que os operadores de adio, subtrao, multiplicao e diviso tenham associatividade da direita para a esquerda.
Defina uma gramtica para expresses aritmticas (operadores +, -, *, /) ps fixadas.
21. Gramticas Dados 2 conjuntos independentes de smbolos:
VT Smbolos terminais.
VN Smbolos no terminais.
Uma gramtica definida como a qudrupla:
(VN, VT, S, P)
Onde,
S ? VN o smbolo inicial da gramtica.
P um conjunto de regras de reescrita na forma: ? ? ?, sendo: ? ? (VN ? VT)* VN (VN ? VT)*
? ? (VN ? VT)*
22. Classificao de Gramticas Irrestritas nenhuma restrio imposta
Sensveis ao Contexto - |?| ? |?|
Livres de Contexto - ? ? VN ? ? (VN ? VT)+
Regulares - ? ? VN
? tem a forma a ou aB, onde
a ? VT e B ? VN
23. Gramticas Regulares Uma gramtica regular gera uma linguagem regular.
C ? 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9
| 0C | 1C | 2C | 3C | 4C | 5C | 7C | 8C | 9C
24. Linguagens Regulares Geradas a partir de uma gramtica regular;
Podem ser representadas atravs de uma expresso regular;
Podem ser reconhecidas por Autmatos Finitos.
Considerando linguagens compostas por smbolos 0 e 1 podemos afirmar:
a linguagem L1 ={0n1n | n ? 1} no regular; a linguagem L2 ={0n1m | n ? 1, m ? 1} regular;
25. Expresses Regulares Maneira compacta de representar linguagens regulares. composta de 3 operaes. Sendo e1 e e2 expresses que geram respectivamente duas linguagens regulares L1 e L2:
26. Expresses Regulares Exemplos:
identificador ? (letra | _) (letra | digito | _)*
letra ? a | b | ... | z | A | B | ... | Z
digito ? 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
constInt ? digito digito*
constDouble ? digito digito*.digito* | . digito digito*
27. Autmato Finito A linguagem gerada por uma gramtica regular pode ser reconhecida por um autmato finito.
Um autmato finito consiste em:
28. Autmato Finito
29. Autmato Finito
30. Autmato Finito Implementao
31. Geradores de Analisadores Lxicos
32. Anlise Lxica - Exerccios Escreva uma gramtica, expresso regular e AFD que defina os nmeros binrios terminados em zero.
Mostre uma expresso regular e o AFD correspondente a gramtica abaixo:S ? aS B ? bC C ? aC | aB | a
Escreva uma expresso regular para as constantes double da linguagem C.
33. Especificao Anlise Lxica expresses regulares.
Anlise Sinttica gramticas livres de contexto.
Anlise Semntica sistema de tipos (regras de inferncia), semntica denotacional, semntica operacional, semntica de aes.
Gerao/Otimizao de Cdigo linguagens para descrio de arquiteturas.
34. Analisador Sinttico
35. Mtodos top-down
36. Mtodo Descendente Recursivo
37. Mtodo Descendente Recursivo
38. Analisadores Sintticos Preditivos
39. Fatorao a Esquerda
40. Fatorao a Esquerda
41. Eliminao da Recursividade a Esquerda
42. Eliminao da Recursividade a Esquerda
43. Anlise Sinttica Preditiva no Recursiva LL(1)
44. Analisador Sinttico LL(1)
45. Analisador Sinttico LL(1)
46. Construo da Tabela LL(1)
47. Construo da Tabela LL(1)
48. Construo da Tabela LL(1)
49. Construo da Tabela LL(1)
50. Mtodos bottom-up
51. Mtodos LR(k)
52. Mtodos LR
53. Algoritmo LR(1)
64. Tabelas SLR(1)
65. Construo da Tabela Sinttica SLR(1)
66. Construo da Tabela Sinttica SLR(1)
67. Construo da Tabela Sinttica SLR(1)
68. Construo da Tabela Sinttica SLR(1)
69. Construo da Tabela Sinttica SLR(1)
70. Construo da Tabela Sinttica SLR(1)
71. Construo da Tabela Sinttica SLR(1)
72. Construo da Tabela Sinttica SLR(1)
73. Construo da Tabela Sinttica LR(1)
74. Construo da Tabela Sinttica LR(1)
75. LALR lookahead LR
76. Construo da Tabela Sinttica LALR(1)
77. Hierarquia de Gramticas Livres de Contexto
78. Uso de Gramticas Ambguas
79. Lex delim [ \t]
ws {delim}+
digito [0-9]
num {digito}+(\.{digito}*(E[+-]?{digito}+)?)?
%%
{ws} {}
"+" {return TADD;}
"-" {return TSUB;}
"*" {return TMUL;}
"/" {return TDIV;}
"(" {return TAPAR;}
")" {return TFPAR;}
\n {return TFIM;}
{num} {yylval=atof(yytext); return TNUM;}
80. yacc %{
#include <stdio.h>
#include <stdlib.h>
#define YYSTYPE double
%}
%token TADD TMUL TSUB TDIV TAPAR TFPAR TNUM TFIM
%%
81. yacc Linha :Expr TFIM {printf("Resultado:%lf\n", $1);exit(0);}
;
Expr: Expr TADD Termo {$$ = $1 + $3;}
| Expr TSUB Termo {$$ = $1 - $3;}
| Termo
;
Termo: Termo TMUL Fator {$$ = $1 * $3;}
| Termo TDIV Fator {$$ = $1 / $3;}
| Fator
;
Fator: TNUM
| TAPAR Expr TFPAR {$$ = $2;}
;
%%
82. yacc
int yyerror (char *str)
{
printf("%s - antes %s\n", str, yytext);
}
int yywrap()
{
return 1;
}
83. Programa #include <stdio.h>
extern FILE *yyin;
int main()
{
yyin = stdin;
printf("Digite uma expresso:");
yyparse();
return 0;
}
84. Definio Dirigida pela Sintaxe
85. Definio Dirigida pela Sintaxe
86. rvores Sintticas E ? E1 + T {E.ptr = criarNo (+, E1.ptr, T.ptr)}
E ? T {E.ptr = T.ptr}
T ? T1 * F {T.ptr = criarNo (*, T1.ptr, F.ptr)}
T ? F {T.ptr = F.ptr}
F ? (E) {F.ptr = E.ptr}
F ? const {F.ptr = criarFolha(const.lexval)}
87. DAG Grafo Direcionado Acclico Identifica as subexpresses comuns.
Exemplo:
DAG que representa a expresso: a * b + c + a *b.
88. Cdigo de 3 endereos Uma sequncia de enunciados na forma:
x = y op z
Onde x, y e z so nomes, constantes ou dados temporrios (criados pelo compilador) e op representa uma operao qualquer.
Uma verso linearizada da rvore sinttica, assim chamado por cada instruo poder conter at trs endereos, dois para os operandos e um para o resultado. Bastante semelhante a linguagem de montagem.
89. Cdigo de 3 endereos Exemplo: a = 2 * b + c
t1 = 2 * b
t2 = t1 + c
a = t2
90. Cdigo de 3 endereos S ? id = E {S.cod = E.cod ++ gerar(id.lexval = E.local)}
E ? E1 + T {E.local = novoTemporario();
E.cod = E1.cod ++T.cod ++ gerar(E.local = E1.local + T.local)}
E ? T {E.local = T.local; E.cod = T.cod}
T ? T1 * F {T.local = novoTemporario();
T.cod = T1.cod ++ F.cod ++ gerar(T.local = T1.local * F.local)}
T ? F {T.local = F.local; T.cod = F.cod}
F ? (E) {F.local = E.local; F.cod = E.cod}
F ? id {F.local = id.lexval; F.cod =}
F ? const {F.local = const.lexval; F.cod =}
91. Cdigo de 3 endereos Alguns enunciados comumente usados:
92. Cdigo de 3 endereos n = 1;
f = 1;
while (n < 10)
{
f = f * n;
n = n + 1;
}
93. Cdigo de 3 endereos n = 1;
f = 1;
while (n < 10)
{
f = f * n;
n = n + 1;
}
94. Definies S-atribudas Definies dirigidas pela sintaxe que possuem apenas atributos sintetizados.
95. Definies L-atribudas Uma definio dirigida pela sintaxe L-atribuda se cada atributo herdado de Xj, 1 ? j ? n, do lado direito de uma produo, A ? X1X2...Xn depende somente:
96. Traduo Top-Down S ? E {imprimir (E.val)}
E ? T {E.h = T.val} E {E.val = E.s}
E ? +T {E1.h = E.h + T.val} E1 {E.s = E1.s}
E ? ? {E.s = E.h}
T ? F {T.h = F.val} T {T.val = T.s}
T ? * F{T1.h = T.h * F.val} T {T.s = T1.s}
T ? ? {T.s = T.h}
F ? const {F.val = const.lexval}
F ?({push(T.h); push(E.h)} E {E.h = pop(); T.h = pop()})
97. Anlise Semntica D ? var S
S ? id L {atribuirTipo(id.lexval, L.tipo)}
S ? S id L {atribuirTipo(id.lexval, L.tipo)}
L ? , id L1 {atribuirTipo(id.lexval, L.tipo); L.tipo = L1.tipo}
L ? :T {L.tipo = T.tipo}
T ? integer {T.tipo = integer}
T ? string {T.tipo = string}
98. Anlise Semntica E ? E1 + T {if (E1.tipo = T.tipo) then E.tipo = E1.tipo else error()}
E ? T {E.tipo = T.tipo}
T ? T1 * F {if (T1.tipo = F.tipo) then T.tipo = T1.tipo else error()}
T ? F {T.tipo = F.tipo}
F ? id {F.tipo = consultaTipo(id.lexval);}
F ? constInt {F.tipo = Inteiro}
F ? constReal {F.tipo = Real}
Obs: Em uma situao real as regras semnticas devem implementar a coero dos tipos.
99. Expresses Lgicas e Relacionais B ? B1 or M C {corrigir(B1.listaf, M.label);
B.listav = merge(B1.listav, C.listav);
B.listaf = C.listaf;}
B ? B1 and M C {corrigir(B1.listav, M.label);
B.listaf = merge(B1.listaf, T.listaf);
B.listav = C.listav;}
B ? C {B.listav = C.listav; B.listaf = C.listaf;}
C ? not C1 {C.listav = C1.listaf; C.listaf = C1.listav;}
C ? (B) {C.listav = B.listav; C.listaf = B.listaf;}
C ? E1 rel E2 {C.listav = criaLista(proxInst);
C.listf = criaLista(proxInst+1);}
gerar(if E1.local rel E2.local goto _);
gerar (goto _);
M ? ? {M.label = novolabel()}
100. Comandos de Seleo e Repetio S ? if (B) then M S {corrigir (B.listav, M.label);
corrigir(B.listaf, novolabel();}
S ? if (B) then M1 S N else M2 S
{corrigir(B.listav, M1.label);
corrigir(B.listf, M2.label);
corrigir(N.listav, novoLabel();}
S ? while M1 (B) M2 S
{corrigir(B.listav, M2.label);
gerar(goto M1.label);
corrigir(B.listaf, novolabel();}
N ? ? {N.listav = criarLista(ProxInstr); gerar(goto _);}
101. Organizao da Memria
102. Dados Estticos A rea de memria reservada no incio da execuo do programa e liberada apenas no fim de sua execuo (e.g. variveis globais e variveis locais declaradas com o modificador static em linguagem C).
103. Dados Dinmicos Pilha rea de armazenamento temporrio onde armazenado o registro de ativao das funes.
Heap rea reservada para alocao dinmica, permite ao programador alocar e liberar espaos de memria quando necessrio (e.g. funes malloc e free em linguagem C).
104. Registro de Ativao As informaes necessrias para execuo de uma funo/procedimento so gerenciadas utilizando um bloco de memria chamado registro de ativao, fazem parte do registro de ativao: parmetros, endereo de retorno e variveis locais.
105. Chamadas de Funes/Procedimentos int fat (int n)
{
if (n >= 1)
return 1;
return n * fat(n-1);
} fat:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %ebx
cmpl $1, %ebx
jl L1:
movl $1, %eax
movl %ebp, %esp
popl %ebp
ret
L1: subl $1, %ebx
pushl %ebx
call fat
subl $4, %esp
movl 8(%ebp), %ebx
imull %ebx, %eax
movl %ebp, %esp
popl %ebp
ret
106. Chamadas de Funes/Procedimentos int fat (int n)
{
if (n >= 1)
return 1;
return n * fat(n-1);
}
Int main()
{
int x;
x = fat(3);
}