Sie sind auf Seite 1von 43

Compilador

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

A fase de anlise normalmente se subdivide em:


anlise lxica, anlise sinttica e anlise semntica.

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.

Pr-processador Analisador Lxico Analisador Sinttico

front-end

Analisador Semntico
Gerador de Cdigo
(intermedirio)

Otimizador

back-end
Gerador de Cdigo

final = (nota1 + nota2) / 2;

Analisador Lxico
Id1 = (Id2 + Id3) / 2

Analisador Sinttico
= Id1 + Id2 Id3 / 2

Tabela de Smbolos
Id1 Id2 Id3 ... final nota1 nota2 double double double ... ... ...

Analisador Semntico = Id1 + Id2 Id3 / intToDouble(2)

Gerador de Cdigo (intermedirio)

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

Temp1 = id3 *2.0


Id1 = id2 / temp1
Gerador 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

Compilador simples de uma passagem

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.

Estrutura da vanguarda de um compilador

Fluxo de caracteres de entrada

Analisador lxico

Fluxo de tokens

Tradutor dirigido pela sintaxe

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

If (expresso) comando else comando

O comando if, um parntese esquerda, uma expresso, um parntese direita, um comando, a palavra else e outro comando

cmd -> if (expr) cmd else cmd

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:

<expresso> <expresso> + <expresso>

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

Elementos de uma gramtica livre de contexto


Conjunto de tokens (smbolos terminais) Conjunto no-terminais Conjunto de produes, onde a produo consiste em um no-terminal, chamado de lado esquerdo da produo, uma seta e uma sequncia de tokens e/ou noterminais, chamado de lado direito da produo Uma designao a um dos no terminais como smbolo de partida

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> <expr> (<expr>)

<expr> +

<const>

<expr> - <expr> <const> 10 <const> 2 3

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>

Traduo Dirigida pela Sintaxe


Programa Fonte

Analisador Lxico
token Solicita token

Tabela de Smbolos

...

Analisador Sinttico

Analisador Semntico Cdigo Intermedirio

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

Definio dirigida pela Sintaxe


A definio dirigida pela sintaxe usa gramtica livre de contexto para especificar a estrutura sinttica de entrada. Cada smbolo da gramtica associa um conjunto de atributos e cada produo associa um conjunto de regras semnticas para computar os valores dos atributos associados aos smbolos que figuram naquela produo.

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

Por que anlise lxica?


Simplifica a anlise sinttica Simplifica a definio da linguagem Modularidade Reusabilidade Eficincia

Anlise Lxica
constanteInt

digito digito* constanteDouble digito digito*. digito*

digito

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

X* Representa uma seqncia de zero ou mais X.

Autmatos Finitos

Autmatos finitos, ou mquina de estados finitos


autmatos finitos determinsticos autmatos finitos no-determinsticos

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.

Autmato Finito Determinstico

Definio. Um autmato finito determinstico uma quntupla


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

Autmato Finito No-Determinstico

Definio. Um autmato finito nodeterminstico uma quntupla


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

Exemplo. Seja M o autmato finito nodeterminstico (K, , ), s, F), onde

q
q0 a

b
b

(q, )
q0

q0
q0

q0
q1

K = {q0, q1, q2, q3, q4} = {a,b} s = q0 F = K {q4}

q1
q1 q2 q3 q4 q4

b
a b a b

q2
q3 q4 q4 q4 q4

Entrada para um AFND

(q0, bababab)

(q1, ababab) (q3 babab) (q4, abab) (q4, bab) (q4 ab) (q4, b) (q4, )

Portanto, (q0, bababab) aceita por M

Das könnte Ihnen auch gefallen