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> =