Você está na página 1de 26

Construo de Compiladores I

Anlise Lxica

Prof. Odilon Nelson


odilon.nelson@gmail.com
http://odilon.rg3.net

Introduo

Um Analisador Lxico (scanner) l caracteres do


programa fonte e constri as palavras ou
smbolos desse programa. Fornece tokens como
representao interna e abstrata dos smbolos
(operadores, identificadores, inteiros,
delimitadores, ...)

Motivao
Separar a Anlise Sinttica da Lxica traz algumas
vantagens:
1- A sintaxe dos smbolos pode ser descrita por uma
gramtica mais simples;
2- Recebendo tokens em vez de caracteres, o
analisador sinttico ter melhor condies de decidir
o que fazer em cada etapa, pois no precisar
considerar espaos, quebras de linha, comentrios,
etc.

Motivao
3- As propriedades lxicas e sintticas de uma
linguagem podem ser investigadas
independentemente;
4- Permite escrever vrios scanners para um mesmo
analisador sinttico, caso necessrio.
(por exemplo, usar um algoritmo melhor para leitura
de arquivos e caracteres, sem afetar o restante do
compilador)

Relacionamento entre
Analisadores Lxico / Sinttico
Os analisadores podem se relacionar de forma
independente (offline, batch) ou interativa (online).

Relacionamento entre
Analisadores Lxico / Sinttico
Independente
Programa fonte (caracteres)
Analisador Lxico
Programa fonte (tokens)
Analisador Sinttico

Relacionamento entre
Analisadores Lxico / Sinttico
Interativo
Programa fonte (caracteres)
Analisador Lxico
token

prximo token

Analisador Sinttico

Tipos de Tokens
- Identificadores(do usurio, da linguagem palavras-chave, funes embutidas);
- Nmeros (inteiros, reais, complexos);
- Operadores(aritmticos, relacionais, lgicos) ;
- Sinais de pontuao (ponto, vrgula, ponto-evrgula, dois-pontos, ...);
- Parentisadores(abre/fecha: parnteses, colchetes,
chaves)

Descrio dos Tokens

- Gramticas Regulares
- Expresses Regulares
- Autmatos Finitos

Gramticas Regulares
Gramticas para definir alguns smbolos
Id -> Letra | Letra RestoId
RestoId -> Letra | Dgito |
Letra RestoId |
Dgito RestoId

NmeroInteiro -> Dgito |


Dgito NmeroInteiro
Letra -> a | b | c | d |...
Dgito -> 0 | 1 | 2 | 3 |...

Expresses Regulares
Expresses para os mesmos smbolos
Id: letra ( letra | dgito )*
(com letra= [A-Za-z] e dgito= [0-9])
NmeroInteiro: dgito dgito*
Operador: ("+" | "-" | "*" | "/")

Autmatos Finitos
Id:

Autmatos Finitos
NmeroInteiro:

Autmatos Finitos
Operador:

Exerccio
Especifique uma gramtica regular, expresso
regular e autmato finito para o token NmeroReal,
que representa um nmero com parte inteira e
fracionria, em notao cientfica.

Sada do Analisador Lxico


Composta de uma lista de tuplas (os Tokens)
com, tipicamente, dois elementos: o tipo do
smbolo (uma constante) e seu lexema (string)

Sada do Analisador Lxico


Para o fragmento de programa:
delta := b*b - 4*a*c;
Uma possvel sada seria:
<ID,"delta"> <ATRIB> <ID,"b"> <MUL>
<ID,"b"> <SUB> <NUM_INT,"4"> <MUL>
<ID,"a"> <MUL> <ID,"c"> <PONTO_VIRG>

Sada do Analisador Lxico


No exemplo anterior, percebemos que alguns tokens
no tm um lexema associado. Isto feito por
questo de eficincia e economia de memria, para
os lexemas que tm sua forma fixa.
O operador de atribuio em Pascal, por exemplo,
sempre ter o lexema ":=", sendo portanto
desnecessrio armazen-lo. J identificadores
podem estar assciados a N lexemas.

Sada do Analisador Lxico


Geralmente, importante que os tokens armazenem
tambm a posio (linha,coluna) em que foram
encontrados no cdigo-fonte. Tal informao til
para mensagens de erro.

Implementao do Analisador
Lxico
Atravs de um algoritmo que simula um autmato
finito, podemos implementar um Analisador Lxico.

Implementao do Analisador
Lxico
Um exemplo

Implementao do Analisador
Lxico
void readCh(): L o prximo caractere disponvel na
entrada;
boolean readCh(char c): L o prximo caractere,
retornando true se igual ao parmetro informado;
Token proximoToken(): Retorna uma instncia da
classe Token, representando o smbolo
reconhecido; caso encontre um caractere que no
pode formar nenhum smbolo, lana execeo.

Implementao do Analisador
Lxico
Consideremos o seguinte autmato:

Implementao do Analisador
Lxico

Implementao do Analisador
Lxico
Observaes:
- O atributo ch inicializado com um espao em
branco, para que o loop inicial seja executado;
- Uma alternativa a disparar uma exceo seria
retornar um Token representando um erro;
- Para o reconhecimento de smbolos mais
complexos (identificadores, nmeros) pode-se criar

Bibliografia Recomendada
AHO, A., SETHI, R. e ULLMAN, J. D.
Compiladores: Princpios, Tcnicas e
Ferramentas, LTC, 1995
LOUDEN, KENNETH C. Compiladores: Princpios
e Prctica Thomson, 2004
MONGIOVI, GIUSEPPE. Construo de
Compiladores, Notas de Aula. Joo Pessoa: 2002
NICOLLETTI, PEDRO S. Compiladores, Notas de