Analisador
Léxico – parte II
Compiladores
Mariella Berger
Sumário
• Definições Regulares
• Gerador de Analisador Léxico
• Flex
• Exemplos
SÍNTESE
ANÁLISE
As fases de um Compilador
Análise Léxica
Análise Sintática
Análise Semântica
Gerador de Código Intermediário
Otimizador de Código
Gerador de Código
Analisador Léxico
• O analisador léxico lê o programa fonte (caractere por caractere) e retorna os tokens formadores deste;
• Um token descreve um padrão de caracteres tendo algum significado no programa fonte:
• Identificadores
• Operadores
• Palavras chave
• Números
• Delimitadores, etc
Análise Léxica
montante := deposito_inicial + 60;
montante Identificador
:= Símbolo de atribuição
deposito_inicial Identificador
+ Símbolo de adição
60 Número
; Símbolo ponto e vírgula
Exemplo de Tokens
Como descrever Tokens
• Expressões regulares
• Em pascal, um identificador é uma letra
seguida por zero ou mais letras ou dígitos
letra ( letra | dígito ) *
Notação de Expressões
Regulares
Exemplos
Exercícios
Defina expressões regulares para:
Números Romanos
Endereços de ips
Placas de carros
Números de telefones celulares no Brasil
Prefixos de rádios FM (102,3 MHz)
Número de matrícula na UFES
URL de páginas Web
Definições Regulares
Os números sem sinal em Pascal são cadeias tais como 5280, 39.37 e 1.87E4.
A seguinte definição regular corresponde a essa classe de cadeias:
Dígito → 0 | 1 | ...| 9
dígitos → dígito+ /* um ou mais dígito */
fração_opcional → (.dígitos)? /* ? 0 ou 1 ocorrência */
expoente_opcional → (E(+||)?dígitos)?
Num → digitos fração_opcional expoente_opcional
Geradores de Analisadores
Lexicos
O Flex serve para gerar automaticamente programas
(em C) fazendo a leitura de uma entrada, de modo a
varrer um texto e/ou programa a fim de obter uma
sequência de unidades léxicas (tokens).
Os tokens gerados pelos programas criados pelo Flex
serão usualmente processados posteriormente por um
programa que realizará a analise sintática.
– Entrada: Arquivo de descrição do analisador
léxico
– Saída: Programa na linguagem “C” que realiza a análise léxica (default: lex.yy.c)
Geradores de Analisadores
Lexicos
Outros geradores de analisadores léxicos:
TPly – TP Lex / Yacc => Gera um programa em
PASCAL (scanner em Pascal)
JavaCC => Para linguagem Java
Flex++ ou Flexx => Para linguagem C++ (orientado a
objetos)
Flex
Um programa Flex é constituído de 3 partes:
Seção de Declarações
%%
Regras de Tradução (Produções)
%%
Procedimentos Auxiliares
Exemplo 1
Flex
Compilando um arquivo Flex
flex -o<arq_saida.c> <arq_def.l>
*.l => Arquivos que contêm as definições das unidades
léxicas a serem identificadas. Contém um conjunto de
especificações de expressões regulares que serão usadas para reconhecer os tokens.
*.c => Arquivo do programa “C” que implementa o
analisador léxico especificado.
Principais opções do FLEX:
-i => Case Insensitive (ignora diferença entre
maiúscula/minúsculas)
--version => Exibe a versão atual do programa flex em uso
-+=> Geração de código de saída em C++
Compilando um arquivo Flex
gcc <arq_saida.c> -o <arq_executavel> -lfl
Observações importantes sobre a geração do
programa de análise léxica:
É necessário linkar (-l) uma bibliotec (“lib”) do
analisador léxico na compilação do código gerado.
O FLEX usa a lib “fl”.
O programa gerado pode ser executado, onde
usualmente a entrada do texto a ser analisado é
feita pela “stdin” (teclado).
Exemplo 1
Exemplo 2
Expressoes regulares
[0-9] => Reconhece um dígito
[a-zA-Z] => Reconhece uma letra (comum sem
acentos)
[ \t\n] => Reconhece um espaço em branco
ou um tab ou uma nova linha
xxxxx => Reconhece a seqüência de
caracteres “xxxxx”
Metacaracteres
Exercicio
1. Escrever um programa que permite contar o
número de ocorrências de uma cadeia de
caracteres;
2. Escrever um programa que dado um texto,
mostra:
1. número de algarismos;
2. número de letras do alfabeto;
3. número de linha de texto;
4. número de espaços ou tabulações (\t);
5. número de caracteres não identificados nos
pontos anteriores;
Exercícios
3. Escrever um programa que permite identificar
números naturais;
Entrada: 123 abc 12.45 s 245 xyz
Saída: 123 12 45 245
4. Escrever um programa que permite identificar
números inteiros (com ou sem sinal);
5. Escrever um programa que permite identificar
números com parte decimal (com ou sem
sinal).