25
Analisador Léxico – parte II Compiladores Mariella Berger

Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

  • Upload
    vokhue

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Analisador

Léxico – parte II

Compiladores

Mariella Berger

Page 2: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Sumário

• Definições Regulares

• Gerador de Analisador Léxico

• Flex

• Exemplos

Page 3: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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

Page 4: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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

Page 5: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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

Page 6: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Exemplo de Tokens

Page 7: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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

Page 8: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Notação de Expressões

Regulares

Page 9: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Exemplos

Page 10: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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

Page 11: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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

Page 12: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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)

Page 13: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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)

Page 14: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Flex

Um programa Flex é constituído de 3 partes:

Seção de Declarações

%%

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

%%

Procedimentos Auxiliares

Page 15: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Exemplo 1

Page 16: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Flex

Page 17: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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 18: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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 19: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Exemplo 1

Page 20: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Exemplo 2

Page 21: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil
Page 22: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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”

Page 23: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

Metacaracteres

Page 24: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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;

Page 25: Analisador Léxico parte II - inf.ufes.brmberger/Disciplinas/2015_2/Compiladores/... · Números Romanos Endereços de ips Placas de carros Números de telefones celulares no Brasil

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