Analisador Léxico parte II Compiladores Mariella Berger
Sumário Definições Regulares Gerador de Analisador Léxico Flex Exemplos
As fases de um Compilador Análise Léxica Análise Sintática ANÁLISE Análise Semântica Gerador de Código Intermediário Otimizador de Código SÍNTESE 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).