Вы находитесь на странице: 1из 6

Analisador Lxico

O analisador lxico (AL) encarrega-se de fazer a leitura do programa fonte, caracter


por caracter, e separar cada smbolo denominado Toen! "ue ten#a algum signi$cado
para a linguagem ou de a%isar "uando um smbolo "ue n&o faz parte da linguagem
encontrado' (&o exemplos de smbolos) pala%ras reser%adas (*+,-., +./, -0, T1+.,
0O2, 31-L+, etc'), nomes de %ari4%eis, nomes de fun56es ou mtodos, sinais de
opera56es (7, -, 8, 9, etc'), sinais de pontua5&o (: ;, < =, >)'
?@A x?> B@ true begin
?@A C constante inteira>
D? C nome de %ari4%el ou procedimento>
> C smbolo especial ponto-e-%rgula!>
E@ C nome de %ari4%el ou procedimento>
True C constante booleana>
*egin C pala%ra reser%ada'
A descri5&o da linguagem diz "uais s&o os smbolos %4lidos e o "ue signi$cam
+rros lxicos
F caracteres n&o pre%istos, se"GHncias in%4lidas, +O0 durante o
recon#ecimento de um smbolo, +O0 "uando se pede um smbolo,I
o ?@Ax?begin(end
o ?@A C constante inteira>
o D?begin C nome de %ari4%el ou procedimento>
o (C smbolo especial abre parHnteses!>
o End palavra reservada
Analisador sinttico
Esta analise avalia se a sintaxe dos programas e comandos esto corretos. Atravs da
anlise lxica obtido um grupo de TOKENS, para ue o analisador sinttico use um
con!unto de regras para construir uma rvore sinttica da estrutura.
Tipos de analisadores sintticos
A tarefa do analisador sint4tico essencialmente a de determinar se uma entrada de
dados pode ser deri%ada de um smbolo inicial com as regras de uma gram4tica
formal' -sso pode ser feito de duas maneiras)
/escendente (top-down) - um analisador pode iniciar com o smbolo inicial e
tentar transform4-lo na entrada de dados' -ntuiti%amente, o analisador inicia
dos maiores elementos e os "uebra em elementos menores' +xemplo)
analisador sint4tico LL'
Ascendente (bottom-up) - um analisador pode iniciar com um entrada de dados
e tentar reescre%H-la at o smbolo inicial' -ntuiti%amente, o analisador tentar
localizar os elementos mais b4sicos, e ent&o elementos maiores "ue contHm
os elementos mais b4sicos, e assim por diante'
O AL n&o se preocupa em %eri$car se a ordem em "ue os smbolos aparecem %4lida
ou n&o>
O analisador sint4tico o cora5&o! do compilador, respons4%el por %eri$car se
a se"GHncia de smbolos contida no programa fonte forma um programa %4lido
ou n&o
if (a - ?J K b 8 @)
a L b>
O A( de%e ser capaz de analisar esse programa e recon#ecH-lo como %4lido'
ApMs a pala%ra reser%ada -0 de%e %ir um (
Nma express&o
Nm )
Nm comando "ual"uer (por exemplo, a L b!)
/escri5&o da linguagem
O A( construdo sobre uma gram4tica li%re de contexto "ue descre%e a
linguagem fonte>
+ssa gram4tica composta de uma srie de regras "ue descre%em "uais s&o
as constru56es %4lidas da linguagem>
O A( de%e aceitar a"ueles programas "ue seguem essas regras e reOeitar C
indicando a ocorrHncia de um erro sint4tico C a"ueles "ue as %iolam'
+rros sint4ticos
(e"GHncias in%4lidas de smbolos) omiss&o, inser5&o, substitui5&o, troca,I
Pr%ore sint4tica
O A( desempen#a ainda outra importante fun5&o "ue a constru5&o da 4r%ore
sint4tica (4r%ore de deri%a5&o) do programa fonte>
Nma 4r%ore sint4tica uma estrutura em forma de 4r%ore "ue descre%e as
constru56es da linguagem recon#ecidas pelo A( no programa fonte>
(e o programa fonte possui um comando if como a"uele %isto #4 pouco, sua
4r%ore sint4tica de%e espel#ar esse fato e descre%er como esse comando
formado'
Analisador semntico
O analisador semQntico (A(em) %eri$ca se as estruturas sint4ticas est&o
semanticamente corretas em rela5&o a especifica5&o da linguagem, ou seOa, se
n&o existem incoerHncias "uanto ao signi$cado das constru56es utilizadas pelo
programador, por exemplo, uma multiplica5&o entre tipos de dados diferentes>
.&o utiliza mais o programa fonte para fazer tal %eri$ca5&o' +m %ez disso,
utiliza a 4r%ore sint4tica como representa5&o do programa>
Tipos de operandos incompat%eis com operadores' (e ti%ermos o comando a
= b * c e a %ari4%el c foi declarada do tipo string, ent&o o analisador semQntico
de%e apontar um erro semQntico, pois esse tipo de operando n&o compat%el
com o operador 8>
Rari4%eis n&o declaradas>
2edeclara5&o de %ari4%eis>
S#amadas de fun56es ou mtodos com o nTmero incorreto de parQmetros>
Somandos colocados fora de contexto' Uor exemplo, a utiliza5&o de um
comando continue fora de um comando de la5o de%e ser apontada como um
erro semQntico'
Erros semnticos
F -dentificadores n&o declarados ou redeclarados, utiliza5&o fora do seu domnio,
incompatibilidade de tipos,I
+sses erros n&o s&o detectados pelo A(, pois n&o constituem erros sint4ticos' /e
acordo com a gram4tica da linguagem fonte, uma %ari4%el c pode ser utilizada em uma
express&o como a = b * c , n&o importando se foi declarada anteriormente ou n&o, ou
"ual o seu tipo'
Urograma exemplo em linguagem S
Legenda)
+rro lxico
+rro sint4tico
+rro semQntico
Vinclude
Vinclude
Vdefine WADX*N0
98A tentati%a de compilar esse cMdigo ir4 gerar um erro detectado pelo analisador sint4tico89
98.&o foi definido um %alor para YWADX*N0Y89
98O correto seria por exemplo) Vdefine WADX*N0 ?@J 89
98 a) 89
tBpedef struct aluno <
c#ar nome:ZJ;>
int ano>
c#ar curso:x;[ /* Nesta linha encherga-se trs tipos de erro: */
98 Nm erro semQntico, pois n&o foi declarada a %ari4%el YxY 89
98 Nm erro sint4tico pois espera%a um Y>Y depois da declara5&o 89
98 Nm erro lxico pois a linguagem n&o recon#ece o caracter Y[Y 89
float media>
= aluno>
98 b) 89
aluno 8 copiaXaluno( aluno 8a)
<
aluno 8t>
tL(aluno 8)malloc(sizeof(aluno))>
if :tLL.NLL) 98 .esta lin#a #4 um erro sint4tico, pois apMs o -0 espera%a-se um Y(Y 89
return t>
8t L 8a>
98 ou)
strcpB(t-Knome,a-Knome)>
t LK ano L a LK ano> 98 .esta lin#a #4 um erro lxico, pois a linguagem n&o recon#ece
o Toen LK!, o correto seria -K! 89
strcpB(t-Kcurso,a-Kcurso)>
t-Kmedia L a-Kmedia>
89
return t>
=
98 c) 89
%oid guardaXaluno( aluno 8 a, c#ar 8 filename)
<
0-L+ 8f>
if (aLL.NLL) return>
f L fopen(filename,YaY)>
if (fLL.NLL) return>
fprintf(f, Y\s]t\d]t\s]t\f]nY,a-Knome,a-Kano,a-Kcurso,a-Kmedia)>
fclose(f)>
=
98 exemplo 89
%oid mostraXaluno(aluno 8 a)
<
if (aLL.NL) return> 98 .esta lin#a ocorre um erro lxico, pois o compilador n&o
recon#ece o Toen Y.NLY, na linguagem S est4 declarado como Y.NLLY 89
printf(Y]nnome)\s]nano)\d]ncurso)\s]nmedia)\f]nY,a-Knome,a-Kano,a-Kcurso,a-
Kmedia)>
=
%oid mostraXfic#eiro(c#ar 8 filename)
<
0-L+ 8f>
c#ar buf:WADX*N0;>
f L fopen(filename,YrY)>
if (fLL.NLL)
<
printf(Y]n+rro na abertura do fic#eiro ]Y\s]Y^]nY, filename)>
return>
=
printf(Y]n0ic#eiro ]Y\s]Y]nY, filename)>
fgets(buf, WADX*N0, f)>
_#ile (^feof(f))
<
printf(Y\sY,buf)>
fgets(buf, WADX*N0, f)>
=
fclose(f)>
=
int main(int argc, c#ar8 arg%:;)
<
aluno a? L <YUaulo (il%aY, ?```, Y+-Y, ?Z'@0=>
aluno a@ L <Y2icardo Wal#eiroY, ?``a, Y++SY, ?@'a0=>
aluno aA L <YUaula Oli%eiraY, ?```, Y(+Y, ?b'?0=>
aluno 8 at>
printf(Y]nAlunos)]nY)>
mostraXaluno(ca?, ca@)> 98 14 um erro semQntico nesta lin#a 89
98 A classe mostraXaluno n&o possui dois argumentos 89
mostraXaluno(ca@)>
mostraXaluno(caA)>
printf(Y]n0ic#eiro -nicial)]nY)>
mostraXfic#eiro(teste)> 98 .esta lin#a #4 um erro semQntico 89
98 .&o foi declarada a %4ria%el teste 89
98 + como foi declarado como c#ar,o correto seria por exemplo)
mostraXfic#eiro(Yteste'txtY) 89
printf(Y]nSMpia ?)]nY)>
at L copiaXaluno(ca?)>
mostraXaluno(at)>
guardaXaluno(at,Yteste'txtY)>
printf(Y]nSMpia @)]nY)>
at L copiaXaluno(ca@)>
mostraXaluno(at)>
guardaXaluno(at,Yteste'txtY)>
printf(Y]n0ic#eiro 0inal)]nY)>
mostraXfic#eiro(Yteste'txtY)>
return J>
=

Вам также может понравиться