Vous êtes sur la page 1sur 39

Unidade I

COMPILADORES E
COMPUTABILIDADE

Prof. Leandro Fernandes

Roteiro
Contextualizao e conceitos bsicos
O que acontece desde a codificao
at a execuo de um programa?
O modelo de anlise e sntese
Anlise lxica
lxica, a 1 etapa!
O emprego das gramticas regulares
e autmatos finitos
O processo de anlise sinttica.
Tipos
p de analisadores
e recuperao de erros
Analisadores descendentes.
Descendentes recursivos
e LL(1)

Linguagens, ferramentas
e tradutores

Assembly
Java
HTML
PHP
C/C++

JVM
dot NET
Browser

Visual
Studio
Eclipse
Netbeans

Linguagem

Ferramenta
de Apoio

Interpretador

Compilador
Tradutor
Montador
gcc
javac
masm

Da codificao a execuo

Cdigo fonte

Prprocessador

Cdigo fonte
sem macros

Compilador

Cdigo em
Linguagem de
Montagem

Montador

Cdigo objeto

Linker
(Ligador)

Cdigo de
mquina
realocvel

Loader - SO

Cdigo de
mquina
absoluto

(Carregador)

Estrutura dinmica
de um compilador

Estrutura dinmica
de um compilador (cont.)

Compiladores vs. interpretadores

Compiladores vs. interpretadores

Compiladores de duas passagens


(modelo de anlise e sntese)

Interatividade
Qual tipo de software tradutor deve ser
utilizado para programas em geral, quando
a velocidade de execuo uma exigncia
de alta prioridade?
a) Compiladores.
b) Interpretadores.
c) Tradutores hbridos.
d) Macroprocessadores.
e) Interpretadores de macroinstrues.

Analise lxica
(tokenizao ou scanning)
Produzir smbolos terminais:

Ignorar e descartar smbolos irrelevantes:


espaos em branco;
caracteres de tabulao;
caracteres de controle (CR e LF);
Comentrios.
Tokens possuem uma estrutura sinttica:
identif:=
id tif letra
l t { lletra
t | dgito
d it }
nmero:= dgito { dgito }
if := i f
igual := "== ...

Por que o analisador lxico no


uma parte do analisador sinttico?
Isso deixaria o analisador sinttico
mais complicado de ser construdo.
Dificulta a distino entre palavras
reservadas e identificadores.

Precisaria ser reescrito na forma:

Por que o analisador lxico no


uma parte do analisador sinttico?
O scanning deve eliminar brancos,
tabulaes, fins de linha e comentrios.
Esses caracteres podem ocorrer em
qualquer lugar do cdigo, levando a
gramticas muito complexas.

Tokens podem ser descritos


por linguagens regulares:
mais simples e mais eficientes
que as gramticas livres de contexto.

Usando uma gramtica regular


para representar lexemas
Um gramtica dita regular se suas
produes so na forma:

Ex.:
Ex : gramtica de nomes
nomes.

Definio alternativa:

O scanner como um AFD


(Autmato Finito Determinstico)
Exemplo para a entrada: max >= 30

Portanto, a anlise lxica dever:


esquadrinhar o cdigo fonte,
smbolo a smbolo, compondo tokens,
e classific-los;
eliminar elementos desnecessrios
ao processo de compilao;
reconhecer e validar
nmeros inteiros e reais;
reconhecer e validar os elementos
utilizados como identificadores;
prover recursos para que se projete
um mecanismo de controle
de erros mais amigvel;
interagir com o sistema de arquivos.

Interatividade
Dentre os diferentes tipos de mensagens
de erro que podem ser reportados por um
compilador, quais dentre as apresentadas
abaixo so de natureza lxica?
a) Identificador no declarado.
b) Esperado fim de comentrio.
c) Esperado smbolo X,
porm encontrado smbolo Y.
d) Nmero de parmetros insuficiente
(durante a chamada de uma sub-rotina).
sub rotina)
e) Tipo misturado (durante uma atribuio).

Anlise sinttica:
2 etapa do processo de anlise

Analisador
Lxico

Tokens

Analisador
Sinttico

rvore
sinttica
Tabela de
smbolos

A anlise sinttica deve:


Comprovar que a sequncia de tokens
cumpre as regras sintticas
da linguagem:
identificar erros de sintaxe.
Compor a estrutura hierrquica
dos comandos e expresses:
A/B*C

(A/B) * C em Fortran
A / (B*C) em APL

Recuperao de erros de sintaxe.


Importante: no retardar, de forma
significativa, o processamento de
programas corretos.

Especificando a linguagem
por meio de Gramticas Livres
de Contexto
Gramticas regulares no podem
lidar com estruturas aninhadas
ou com recurses centrais:
Expr ... "(" Expr ")" ...
Cmd "do"
do Cmd "while"
while "("
( Expr ")
)
Soluo: Gramticas Livres de Contexto.
Vantagens na utilizao de gramticas:
especificaes sintticas;
p
permite uso de geradores
g
automticos;;
o processo de construo pode
levar identificao de ambiguidades;
facilidade em ampliar/modificar
a linguagem.

Tipos de analisadores sintticos


Mtodos descendentes (Top Down):
Constroem a rvore sinttica de cima para
baixo (da raiz para as folhas), ou seja, do
smbolo inicial da gramtica para a
sentena:
Analisadores descendentes recursivos;
Analisadores LL(k).
E

E
E

E
T

a + a * a

a + a *a

E
T

T *F

a + a *a

a + a *a

a + a *a

Tipos de analisadores sintticos


Mtodos ascendentes (Bottom-up):
Constroem a rvore sinttica de baixo
para cima (das folhas para a raiz), ou
seja, reduz os smbolo da sentena at
alcanar o smbolo inicial da gramtica:
Analisadores LR;
Analisadores LALR.
E
E

a + a *a

a + a * a

a + a *a

E
F

a + a *a

a + a *a

Tipos de analisadores sintticos


Tanto em analisadores ascendentes
quanto descendentes a entrada sempre
examinada da esquerda para a direita,
um smbolo por vez.
Muitos compiladores so dirigidos
pela sintaxe (parsen driver), isto ,
o analisador sinttico chama o
analisador lxico.
Ferramentas para gerao automtica
de analisadores sintticos baseiam-se
na gramtica.
Ex.: Yacc, Bison e ANTLR.

Recuperao de erros
Modo Pnico ou Desespero:
para imediatamente; ou
descarta smbolos at que
seja encontrado um token
de sincronizao.
Recuperao de frases:
tenta realizar uma correo local,
substituindo alguns elementos que
permitam anlise prosseguir.
Ex.: substituir uma vrgula
inadequada por um ponto e vrgula,
remover um : excedente.

Recuperao de erros (cont.)


Produes de erro:
aumenta-se a gramtica, incluindo
regras de forma a acomodar os erros
mais comuns.
Correo global:
um algoritmo escolhe a sequncia
mnima de mudanas necessrias para
se obter a correo.
Ex.: dada uma cadeia x, o parser
procura rvores gramaticais que
permitam transformar x em y (cadeia
correta) com um mnimo de
modificaes.

Interatividade
Analise o texto:
Na compilao, a anlise consiste em trs fases.
Em uma das fases, os caracteres ou tokens so
agrupados hierarquicamente em colees
aninhadas com significado coletivo. Essa fase
envolve o agrupamento dos tokens do programa
fonte em frases gramaticais, que so usadas pelo
compilador, a fim de sintetizar a sada. Usualmente,
as frases gramaticais do programa fonte so
representadas por uma rvore gramatical.
A fase citada no texto conhecida como anlise:
a)
b)
c)
d)
e)

sinttica.
semntica.
lxica.
binria.
linear.

Anlise sinttica
Tarefa: dada uma gramtica livre de
contexto G e uma sentena s, o analisador
sinttico deve verificar se s pertence
linguagem gerada por G.
O analisador tenta construir a rvore
de derivao para s segundo as regras
de produo dadas pela gramtica G.
Se esta tarefa for possvel, o programa
considerado sintaticamente correto.
O analisador no precisa efetivamente
construir a rvore, mas sim comprovar
que possvel constru-la.
Pode ser emulado utilizando-se
uma pilha de dados.

Anlise sinttica descendente:


analisadores descendentes
recursivos
So construdos transcrevendo-se cada
uma das regras de produo da gramtica
como uma sub-rotina que ser
responsvel por consumir os
tokens da sentena.
Assim, temos:
para cada smbolo no terminal da regra,
invocamos a sub-rotina correspondente; e
para cada smbolo terminal da regra
verificamos se ele ocorre na posio
corrente da anlise.

Anlise sinttica descendente:


analisadores descendentes
recursivos
Suponha a gramtica abaixo:
(1) L

(S)

(2) S

I,S|I

(3) I

a|L
(3)

voidparseI(){
switchs{
case"a":acceptIt();
break();
case"(":parseS();
break;
default:ERRO();
}
}

voidparseL(){
accept("(");
parseS();
accept(")");
}

(1)

voidparseS(){(2)
parseI();
whiles==","{
acceptIt();
parseI();
}
}

Anlise sinttica descendente:


analisadores LL(1)
O nome LL(1) indica que:
a cadeia de entrada examinada da
esquerda para a direita (left-to-right);
o analisador procura construir
uma derivao esquerda (leftmost);
considera-se apenas o 1 smbolo
do restante da entrada.

Anlise sinttica descendente:


analisadores LL(1)
Temos de decidir qual regra A deve
ser aplicada a um n rotulado por um
no terminal A.
A expanso de A feita criando ns
filhos rotulados com os smbolos de .
Considera duas informaes:
o no terminal a ser expandido; e
o smbolo corrente da entrada.
Uma tabela M nos fornece a regra
a ser utilizada com base nessas
duas entradas.
Essa tcnica s pode ser usada para
a classe das gramticas LL(1).

Analisador LL(1)
Seja a gramtica:
(1) E

T E

First(TE) = { (, a}

(2) T

F T

First(FT) = { (, a}

(3) F

(E)

First((E)) = { ( }

(4) F

First(a) = { a }

(5) E'

+ T E

First(+TE) = { + }

(6) E'

Follow(E) = { ), $}

(7) T'

* F T

First(*FT) = { * }

(8) T'

F ll (T) = { +, ),
Follow(T)
) $}

Analisador LL(1)
Seja a gramtica:
(1) E

T E

First(TE) = { (, a}

(2) T

F T

M[ E, ( ] = 1

(3) F

(E)

M[ E, a ] = 1

(4) F

(5) E'

+ T E

(6) E'

(7) T'

* F T

(8) T'

Analisador LL(1)
Seja a gramtica:
(1) E

T E

(2) T

F T

(3) F

(E)

(4) F

(5) E'

+ T E

(6) E'

Follow(E) = { ), $}

(7) T'

* F T

M[ E, ) ] = 6

(8) T'

M[ E,
E $ ] = 6

Analisador LL(1)
Seja a gramtica:
(1) E

T E

(2) T

F T'

(3) F

(E)

(4) F

(5) E'

+ T E

(6) E'

E'

(7) T
T'

*FT
T

T'

(8) T'

Analisando a sentena: a+a


Pilha

Entrada

Regra

a+a

M[E, a] = 1

E T E

T E'

a+a

M[T, a] = 2

TFT'

F T 'E'

a+a

M[F, a] = 4

Fa

a T 'E'

a+a

Verifica a

T 'E'

+a

M[T', +] = 8

T'

E'

+a

M[E', +] = 5

E' + T E

+ T E'

+a

Verifica +

T E'

M[T, a] = 2

TFT'

F T ' E'

[ a]] = 4
M[F,

Fa

a T ' E'

Verifica a

T ' E'

M[T', $] = 8

T'

E'

M[E', $] = 6

E'

Identificando se uma
gramtica LL(1)
EE+T
(2) E T
(3) T T * F
(4) T F
((5)) F ( E )
(1)

(6)

First( E+T ) = { (, a }
First( T ) = { (, a }
M[E, (] = 1 e M[E, a] = 1
M[E,
[ , (] = 2 e M[E,
[ , a]] = 2

Fa

A gramtica dada acima no LL(1) por


causa dos conflitos.
Podemos descobrir por inspeo. As
duas caractersticas mais bvias so:
a possibilidade de fatorao; e
a recurso esquerda.

Interatividade
Analise cada uma das afirmaes dadas
a seguir e indique a que julgar incorreta.
a) Os parsers top-down no tm problemas
em relao a gramticas recursivas
esquerda.
b) Yacc gera parsers bottom-up,
que so mais eficientes.
c) Os parsers bottom-up so
normalmente gerados por ferramentas.
d) Parsers descendentes recursivos
so um exemplo de parser top-down.
e) relativamente fcil escrever um parser
top-down manualmente, usando
funes recursivas.

AT A PRXIMA!