Você está na página 1de 34

Compiladores

Análise Léxica
Prof. Raimundo BARRETO
DCC/UFAM
Introdução
 O analisador léxico (scanner) é a parte do
compilador responsável por ler caracteres do
programa fonte e transformá-los em uma
representação conveniente para o analisador
sintático.
 O analisador léxico lê o programa fonte
caractere a caractere, agrupando os
caracteres lidos para formar os símbolos
básicos (tokens) da linguagem
 identificadores,palavras-chaves, operadores,
parêntesis e sinais de pontuação.
Introdução

símbolo enviado

Programa Analisador Analisador


Fonte Léxico Sintático

solicita novo símbolo


Exemplo
Exemplo: usando códigos
Exemplo: usando códigos
Definições léxicas
 Exemplos
 Diferença entre maiúscula e minúscula?
 Qual o conjunto de palavras reservadas?
 Quais as regras para formação de identificadores?
 Quais os operadores?
 Quais os delimitadores aceitos?
 Quais as regras para formação de números?
 Quais as regras para formação de comentários?
 Etc.
Exemplo
Projeto do Analisador Léxico
 É desejável que se usem notações formais para
especificar e reconhecer a estrutura dos tokens
que serão retornados pelo analisador léxico
 Evitam-se
erros
 Mapeamento mais consistente e direto para o
programa de análise léxica
 Notações
 Gramáticas ou expressões regulares: especificação
de tokens
 Autômatos finitos: reconhecimento de tokens
Expressões Regulares
 Determinam conjuntos de cadeias válidas
 Linguagem

 Exemplos
 Identificador:
letra ( letra | dígito )*
 Número inteiro sem sinal: dígito+
 Número inteiro com sinal: ( + | - ) dígito+
Exemplo de Autômato Finito
Tabela Transição
Execução do Autômato
 Se o autômato é determinístico (i.e., para cada estado s
e símbolo de entrada a, existe somente uma transição
possível e não existem transições vazias), o seguinte
algoritmo pode ser aplicado

s:=s0
c:=próximo_caractere()
enquanto (c<>eof e s for um estado válido) faça
s:=transição(s,c)
c :=próximo_caractere()
fim
se s for um estado final
então retornar “cadeia aceita”
senão retornar “falhou”
Execução do Autômato
 Opção: incorporação das transições no código do programa
 Tabela de transição não é mais necessária
s:=s0
enquanto (verdadeiro) faça
c:=próximo_caractere()
case (s)
0: se (c=‘a’) então s:=1
senão se (c=‘b’) então s:=0
senão retornar “falhou”
1: se (c=‘b’) então s:=2
senão retornar “falhou”
2: se (c=eof) então retornar “cadeia aceita”
senão retornar “falhou”
fim //case
fim //enquanto
Tokens de um Programa
 Não basta identificar o token, deve-se retorná-lo
ao analisador sintático junto com a cadeia
correspondente
 Concatenação da cadeia conforme o autômato é
percorrido
 Associação de ações aos estados finais do autômato

 Às vezes, para se decidir por um token, tem-se


que se ler um caractere a mais, o qual deve ser
devolvido à cadeia de entrada depois
 Função retroceder()
Tokens de um Programa
Tokens de um Programa
Tokens de um Programa

Autômato para identificadores: letra seguida de qualquer


combinação de letras e dígitos
Tokens de um Programa
 Autômato para palavras reservadas: while,
if, for, array, etc.
 Opções
 Fazerum autômato para cada palavra-
reservada
 Trabalhoso e ineficiente
 Deixar que o autômato para identificadores
reconheça as palavras reservadas e, ao final,
verificar na tabela de palavras reservadas se
se trata de uma palavra reservada ou não
 Simples e elegante
Tokens de um Programa
Tokens de um Programa
Autômato para consumir caracteres não imprimíveis: espaços em branco,
tabulações e códigos de nova linha. O analisador léxico não deve produzir
tokens para esses símbolos.
Projeto do Analisador Léxico
 Para cada definição regular da linguagem,
será construído um autômato finito
determinístico
 Com exceção para as palavras reservadas,
pois inicialmente serão tratadas como
identificadores
Projeto do Analisador Léxico
Autômato para relop
Autômato para Identificadores
Autômato para num
 A definição é da forma dígito fração?
expoente?
 Faremos 3 autômatos:
 dígito
 Ponto-flutuante
 Notação científica
 O lexema reconhecido para um dado token
precisa ser o mais longo possível
O analisador léxico não pode parar após enxergar 12
ou 12.3 quando a entrada for 12.3E4
 Portanto, os 3 autômatos precisam ser testados na
ordem reversa
 Inicio pelo autômato mais abrangente
Autômato para num
Autômato para num
Expressões Regulares
 Os padrões que definem as expressões
regulares em flex são dadas na tabela
seguinte.
 É necessário saber que os seguintes
caracteres são meta-caracteres, isto é,
têm um significado próprio:
", \, [, ], (, ), <, >, {, },
^, -, ?, ., *, +, |, $, /, %
Expressões Regulares
Expressões Regulares
Expressões Regulares
 Identificar um número, como 100; 1.1; 1 e
11.10. A especificação FLEX seria:

([0-9]+\.)?[0-9]+ printf(“%s”, “numero”);


. ;

A segunda regra tem como efeito parar o


efeito de eco para todas as expressões não
reconhecidas que é o procedimento normal
do FLEX.
Expressões Regulares
 Inteiros que podem ser negativos
 -?[0-9]+
 Casar com a string foo ou a string ba
seguida de 0 ou mais r’s
 foo|bar*
 Para casar com foo ou zero ou mais bar
 foo|(bar)*
 Para casar com zero ou mais foo ou bar
 (foo|bar)*
Expressões Regulares
 aaa a{3}
 aaa ou aaaa a{3,4}
 bababa (ba){3}
 identificador [A-Za-z] [A-Za-z0-9]*
 2 letras minúsculas [a-z] [a-z]

Você também pode gostar