13

Click here to load reader

compiladores analise lexica

Embed Size (px)

Citation preview

Page 1: compiladores analise lexica

Compiladores

ANALISADOR LÉXICO – PARTE II

Prof. Msc. Mariella Bergerhttp://www.inf.ufes.br/~mberger

[email protected]@gmail.com

Page 2: compiladores analise lexica

Sumário

Definições Regulares

Gerador de Analisador Léxico

Flex

Exemplos

Page 3: compiladores analise lexica

Definições Regulares

Os números sem sinal em Pascal são cadeias tais como 5280, 39.37 e 1.87E­4.

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 

Page 4: compiladores analise lexica

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)

Page 5: compiladores analise lexica

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)

Page 6: compiladores analise lexica

Flex

Um programa Flex é constituído de 3 partes:

Seção de Declarações 

%%

Regras de Tradução  (Produções)

%%

Procedimentos Auxiliares

Page 7: compiladores analise lexica

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

Page 8: compiladores analise lexica

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).

Page 9: compiladores analise lexica

Exemplo 1

Page 10: compiladores analise lexica

Exemplo 2

Page 11: compiladores analise lexica

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”

Page 12: compiladores analise lexica

Meta caracteres

Page 13: compiladores analise lexica

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