Click here to load reader
Upload
marcio-jose
View
40
Download
3
Embed Size (px)
Citation preview
Compiladores
ANALISADOR LÉXICO – PARTE II
Prof. Msc. Mariella Bergerhttp://www.inf.ufes.br/~mberger
[email protected]@gmail.com
Sumário
Definições Regulares
Gerador de Analisador Léxico
Flex
Exemplos
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 Léxicos
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 Léxicos
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)
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
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
Expressões regulares - Flex
[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”
Meta caracteres
Exercícios
Defina as expressões regulares capazes de reconhecer:
– Números Romanos
– Enderećos de ips
– Placas de carros
– Números de telefones no Brasil
– Prefixos de rádios FM (102,3 MHz)
– Número de matrícula na UFES
– URL de páginas Web