Beruflich Dokumente
Kultur Dokumente
Software que traduz o texto (linguagem fonte) que representa um programa para cdigo mquina(linguagem alvo) capaz de ser executado pelo computador
Compilador
Nesse processo de traduo, h duas tarefas bsicas a serem executadas por um compilador:
anlise, em que o texto de entrada (na linguagem fonte) examinado, verificado e compreendido sntese, ou gerao de cdigo, em que o texto de sada (na linguagem objeto) gerado, de forma a corresponder ao texto de entrada.
Compilador
possvel representar completamente a sintaxe de uma Linguagem de Programao atravs de uma gramtica livre de contexto. Deixa-se para a anlise semntica a verificao de todos os aspectos da linguagens que no se consegue exprimir de forma simples usando gramticas livres de contexto.
front-end
Analisador Semntico
Gerador de Cdigo
(intermedirio)
Otimizador
back-end
Gerador de Cdigo
Analisador Lxico
Id1 = (Id2 + Id3) / 2
Analisador Sinttico
= Id1 + Id2 Id3 / 2
Tabela de Smbolos
Id1 Id2 Id3 ... final nota1 nota2 double double double ... ... ...
Tabela de Smbolos
Id1
Id2 Id3 ...
temp1 = intToDouble(2)
temp2 = Id3 * temp1 temp3 = Id2 / temp2 Id1 = temp3
final
nota1 nota2
double
double double
...
... ...
Otimizador de Cdigo
MOVF ID3, R2 MULF #2.0, R2 MOVF ID2, R1 DIVF R2, R1 MOVF R1, ID1
Tabela de Smbolos
Id1 Id2 Id3 final nota1 nota2 double double double ... ... ...
...
Fases de um Compilador
Gerenciamento da tabela de smbolos: uma estrutura de dados contendo um registro para cada identificador, com os campos contendo os atributos do identificador. Quando o analisador lxico detecta um identificador, instala-o na tabela de smbolos. A estrutura de dados permite encontrar rapidamente cada registro e armazenar ou recuperar dados do mesmo.
Fases de um Compilador
Um compilador no deve parar quando encontrar algum erro e sim continuar para detectar todos. A anlise lxica substituir a estrutura por tokens e acrescenta na tabela de smbolos A anlise sinttica transforma um texto na entrada em uma estrutura de dados, em geral uma rvore, o que conveniente para processamento posterior e captura a hierarquia implcita desta entrada A anlise semntica verifica os erros semnticos, (por exemplo, uma multiplicao entre tipos de dados diferentes) no cdigo fonte e coleta as informaes necessrias para a prxima fase da compilao que a gerao de cdigo objeto
Uma linguagem de programao pode ser definida pela descrio da aparncia de seus programas (a sintaxe da linguagem) e do que os mesmos significam (a semntica da linguagem) Para especificar a sintaxe de uma linguagem, apresentamos uma notao amplamente aceita, chamada gramtica livre de contexto ou BFN (Forma Backus-Naur) Para especificar a semntica de uma linguagem usaremos descries informais e exemplos sugestivos.
Gramticas
Uma linguagem consiste essencialmente de uma seqncia de strings ou smbolos com regras para definir quais seqncias de smbolos so vlidas na linguagem, ou seja, qual a sintaxe da linguagem. A interpretao do significado de uma seqncia vlida de smbolos corresponde semntica da linguagem. Existem meios formais para definir a sintaxe de uma linguagem - a definio semntica um problema bem mais complexo. A sintaxe de linguagens expressa na forma de uma gramtica, que ser introduzida na seqncia.
Analisador lxico
Fluxo de tokens
Representao intermediria
Definio da Sintaxe
Uma gramtica descreve a estrutura hierrquica de muitas construes das linguagens de programao. O comando if tem a estrutura em C
O comando if, um parntese esquerda, uma expresso, um parntese direita, um comando, a palavra else e outro comando
Gramticas
Um conjunto de regras de produo, um smbolo de partida. Uma regra de produo tem o formato , onde representa o nome da construo sinttica e representa uma forma possvel dessa construo:
Definio da Sintaxe
A regra chamada de produo If e parnteses so tokens As variveis expr e cmd so sequncias de tokens e no terminais
Gramticas
<expr> <expr> + <expr> | <expr> <expr> | (<expr>) | <const> <const> <const><const> |0|1|2|3|4|5|6|7|9
Derivao
A verificar se uma frase faz parte da linguagem gerada pela gramtica, envolve sucessivas substituies da cadeia de smbolos que ocorre do lado esquerdo da produo pela sua construo sinttica correspondente, partindo do smbolo inicial. Essa substituio chamada derivao sendo normalmente denotada pelo smbolo .
Derivao
<expresso> <expr> + <expr> (<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
rvore Gramatical
(10 2) + 3
<expr> +
<const>
Gramtica Ambguas
10 2 + 3 <expr> <expr> <expr> <expr> + <expr> <expr> <expr> + <expr>
<expr> - <expr> 10 2 3
10
Precedncia de Operadores
Como saber quem precede entre * e +. Para tal criamos mais dois no terminais
Precedncia de Operadores
<expr> <expr> + <termo> | <expr> - <termo> | <termo> <termo> (<expr>) | <const>
<expr>
<expr>
<termo>
<expr> - <termo> <expr> <expr> + <termo> <expr> - <termo> + <termo> 10 2 <termo> - <termo> + <termo> 10 2 + 3
Precedncia de Operadores
<expr> <expr> + <termo> | <expr> - <termo> | <termo> <termo> * <fator> | <termo> / <fator> | <fator> (<expr>) | <const>
1+2*3 <expr>
<termo>
<expr>
<termo>
<fator>
<termo> * <fator> 3 2 3
Gramtica
<expr> <termo> <fator> <expr> + <termo> | <expr> - <termo> | <termo> <termo> * <fator> | <termo> / <fator> | <fator> (<expr>) | <const>
1+2*3 <expr>
<termo>
<termo> * <fator>
Analisador Lxico
token Solicita token
Tabela de Smbolos
...
Analisador Sinttico
Notao Posfixa
(9-5)+2 => 95-2+ 9-(5+2) => 952+ Os parnteses so desnecessrios na notao posfixa porque a posio e a aridade (nmero de argumentos) dos operadores permitem somente um decodificao de uma expresso posfixa
Atributos Sintetizados
O valor em um n da rvore gramatical determinado a partir dos valores dos atributos dos filhos daquele n. Os atributos sintetizados possuem a desejvel propriedade de que podem ser avaliados durante um nico caminhamento bottom-up (final para incio) da rvore gramatical
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), smbolos de pontuao (; , {, }), labels.
Token
Tokens, ou lexemas, uma sequncia de caracteres que podem ser tratados como uma unidade na gramtica de uma linguagem de programao
Anlise Lxica
Entrada: arquivo texto Sada: sequncia de tokens Conta nmero de linhas Remove espaos em branco e comentrios Apresenta smbolos ilegais Produz a tabela de smbolos
Anlise Lxica
constanteInt
digito
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Autmatos Finitos
Compiladores
A implementao de reconhecedores de linguagens regulares (autmatos finitos) mais simples e mais eficiente do que a implementao de reconhecedores de linguagens livres de contexto (autmatos de pilha). Nesse caso, possvel usar expresses regulares para descrever a estrutura de componentes bsicos das Linguagens de Programao, tais como identificadores, palavras reservadas, literais numricos, operadores e delimitadores, etc. Essa parte da tarefa de anlise (anlise lxica) implementada separadamente, pela simulao de autmatos finitos.
M = (K, , *, s, F), onde K um conjunto finito de estados um alfabeto s K o estado inicial F est contido K o conjunto de estados finais a funo de transio, K x para K
Exemplo de um AFD
Exemplo. Seja M o autmato finito determinstico (K, , *, s, F), onde K = {q0, q1} = {a,b} s = q0 F = K {q0}
(q, )
q0 q0 q1 q1
a b a a
q0 q1 q1 q0
Valido no AFD
(q0, abba) (q0, bba) (q1, ba) (q0, a) q (q0 ,) q0 q0 Portanto, (q0, aabba) q1 aceita por M q1
T T T T T
(q0, aabba)
a b a a
(q, ) q0 q1 q1 q0
M = (K, , ), s, F), onde K um conjunto finito de estados um alfabeto s K o estado inicial F est contido K o conjunto de estados finais a funo de transio, K x ( c {,}) para K
Exemplo de um AFND
q
q0 a
b
b
(q, )
q0
q0
q0
q0
q1
q1
q1 q2 q3 q4 q4
b
a b a b
q2
q3 q4 q4 q4 q4
(q0, bababab)
(q1, ababab) (q3 babab) (q4, abab) (q4, bab) (q4 ab) (q4, b) (q4, )