Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
COMPILADORES E
COMPUTABILIDADE
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.)
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:
Ex.:
Ex : gramtica de nomes
nomes.
Definio alternativa:
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/B) * C em Fortran
A / (B*C) em APL
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.
E
E
E
T
a + a * a
a + a *a
E
T
T *F
a + a *a
a + a *a
a + a *a
a + a *a
a + a * a
a + a *a
E
F
a + a *a
a + a *a
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.
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.
(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();
}
}
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'
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
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!