Introdução ao reconhecimento de padrões e expressões regulares; Aprendizagem dos conceitos através da realização de alguns exercícios;



Documentos relacionados
Introdução ao FLEX e expressões regulares

Identificação do discente: Matrícula: Nome completo: Douglas Godeguez Nunes. Curso: Ciência da Computação

3. COMPILAÇÃO E ESTRUTURA BÁSICA DE UM PROGRAMA EM C

Administração de Redes. Permissões gnu/linux

Linguagens de Programação:

Linguagens e Programação FLEX. Paulo Proença

Análise Léxica. Sumário


INTRODUÇÃO À PROGRAMAÇÃO EM FORTRAN

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

Programação de Computadores I. Linguagem C Função

Analisador Léxico parte II

1. Manual Resumido de Gestão de Contratos

C A P I T U L O 6 E S T R U T U R A S D E C O N T R O L E D E R E P E T I Ç Ã O

Estruturas de Repetição

Ficheiros binários 1. Ficheiros binários

Lex Adaptação da obra original de Tom Niemann

Algoritmos e Programação : Conceitos e estruturas básicas. Hudson Victoria Diniz

Universidade Federal da Paraíba Centro de Informática Departamento de Informática

AULA 3 Alocação dinâmica de memória: Ponteiros

Ministério das Finanças Instituto de Informática. Departamento de Sistemas de Informação. Declaração de Rendimentos para a Segurança Social

Documento Geral Explicativo. GS1 Portugal

Admistração de Redes de Computadores (ARC)

Script shell. Exemplo de um script shell. Script shell. José Pedro Oliveira if case. for while until. Sistemas Operativos

INTRODUÇÃO À PROGRAMAÇÃO II VARIÁVEIS COMPOSTAS HOMOGÊNEAS UNIDIMENSIONAIS

MREditor Editor de Impressos

TUTORIAL MATLAB Victor Breder 2016

Os conceitos aprendidos são fundamentais, essenciais para escrever um programa macro. Mas o que é um programa macro?

Introdução à Programação. Funções e Procedimentos. Prof. José Honorato F. Nunes honoratonunes@gmail.com

Programação em FORTRAN V. João Manuel R. S. Tavares

FOLHA DE CÁLCULO ELABORAÇÃO DE GRÁFICOS

Algoritmos e Estruturas de Dados I. Variáveis Indexadas. Pedro O.S. Vaz de Melo

Referências. Programação de Computadores II. Cap. 7 Cadeias de Caracteres. Caracteres. Tópicos

Normas para a elaboração de um relatório. para a disciplina de projecto integrado. 3.º ano 2.º semestre. Abril de 2004

LINGUAGEM SQL Linguagem usada em SGBD para: Definir estrutura de dados; Modificar dados em um banco de dados; Especificar restrições de segurança; Rea

56K ESP-2 Modem 56K ESP-2 MODEM. Manual de instalação rápida. Versão 1.0

Exercícios: Vetores e Matrizes

Representações de caracteres

Manual de Utilizador Portal de Formação RE/MAX v4.0

LINGUAGEM JAVA - RESUMO

Orientação a Objetos

Programação de Computadores I Estruturas de Repetição PROFESSORA CINTIA CAETANO

O AMBIENTE DELPHI. Programação de Computadores.

Programação de CPLDs no ambiente ISE 4.2i da Xilinx

1 d=

Introdução. Flex e uma ferramenta para gerar scanners programas que reconhecem padrões lexicais em texto

Módulo IV Programação Visual Basic. Programação

Linguagem de Programação C. Fluxo de Saída Padrão. Linguagem de Programação C. printf. Fluxo de Saída Padrão. Algoritmos e Lógica de Programação

Sistema de Recuperação da Senha nos Sistemas Informáticos da FEUP

Algoritmo e Pseudo-código

Capítulo 2 Máquinas de Estado

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison

03. [Sebesta, 2000] Descreva a operação de um gerador de linguagem geral.

1. PSTAW10 COAFI - OCORRÊNCIAS

Aula Extra. Depurador Code::Blocks. Monitoria de Introdução à Programação

PHP Estruturas de repetição

LAYOUT DO ARQUIVO DE IMPORTAÇÃO E EXPORTAÇÃO. SITUAÇÃO DO ALUNO 2015 versão 2

Tipos Abstratos de Dados (TAD)

Aplicativo da Cultura

Astra LX Computadores e Impressoras Guia para o processo de Configuração de Computadores e Impressoras conectadas ao Programa AstraLX.

MC Teste de Mesa e Comandos Repetitivos

Introdução. Software Básico Aula 3. Prof. Dr. Rogério Vargas.

Prof. Adilson Gonzaga. Interface com Displays

SISTEMA INTEGRADO DE GERENCIAMENTO DO ISS SIGISS. Manual de Envio de Notas Fiscais Eletrônicas em lote Instruções e Layout

Java possui 4 tipos de dados. Estes tipos de dados são divididos em: boolean, character, integer e float.

6 CONCEPÇÃO BÁSICA DO SISTEMA DE APOIO À DECISÃO

3 Cadeias de Caracteres

1 Cálculo do valor à vista

Erros e Incertezas. Rafael Alves Batista Instituto de Física Gleb Wataghin Universidade Estadual de Campinas (Dated: 10 de Julho de 2011.

Análise e Desenho de Algoritmos Enunciado do Trabalho Prático

Disciplina Fundamentos de Redes. Introdução à Mascara de Subrede

Um Tradutor Dirigido por Sintaxe

Sistema Operacional Unidade 9 Manipulação de Usuários e Grupos

Documento de Requisitos do Sistema SISFOTO Sistema de gerenciamento de eventos fotográficos Versão 1.0

Edição de Tabelas no QGIS

Portal de Carapicuíba Painel Administrativo

MANUAL DO SISTEMA. Versão 6.05

Microsoft Excel Ficha prática n. 8

CAPÍTULO 2 SISTEMAS DE NUMERAÇÃO E CÓDIGOS

TUTORIAL DO SISTEMA CE MERCANTE

Folha 3 - Análise léxica

Operações Básicas de Manipulação de Ficheiros e Pastas

O Correio Electrónico ( ) é um dos serviços mais populares da Internet.

ENCERRAMENTO DE SALDOS (ZERAMENTO) DAS CONTAS DE RESULTADO

Tipos de problemas de programação inteira (PI) Programação Inteira. Abordagem para solução de problemas de PI. Programação inteira

MANUAL DE UTILIZAÇÃO DO AUTO ATENDIMENTO SETOR PÚBLICO DO BANCO DO BRASIL

Cartilha de Acesso Rápido

Circuito Decodificador BCD para Display de Sete Segmentos

1.2. Grandezas Fundamentais e Sistemas de Unidades

Compiladores. Análise Léxica

ANVISA BPF, PROCESSO DE FABRICAÇÃO E SISTEMA DE CODIFICAÇÃO. Artur J. Gradim. SÃO PAULO 28 DE Agosto de 2006

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux

Prova Modelo. Nome: Número:

Tutorial Extra sobre C. Felipe Santos da Silva

Informação-Prova de Equivalência à disciplina de: Aplicações Informáticas B. 1. Introdução. Ensino Secundário. Ano letivo de 2011/12

2. O arquivo conterá as NFS-e emitidas em determinado período, a critério do contribuinte.

Introdução à Algoritmos. Aula 11

Compiladores II. Fabio Mascarenhas

Transcrição:

Capítulo 1 Introdução ao Flex Objectivos: Familiarização com a ferramenta FLEX; Introdução ao reconhecimento de padrões e expressões regulares; Aprendizagem dos conceitos através da realização de alguns exercícios; Apresentar o ambiente de trabalho proposto (secção 1.6); Relembrar alguns comandos básicos de Linux importantes para a utilização do FLEX (secção 1.7). 1.1 Analisadores léxicos Um analisador léxico (scanner) é um programa que permite ler os caracteres de um ficheiro de texto (e.g., programa fonte) e produzir uma sequência de componentes léxicos (tokens) que serão utilizados pelo analisador sintáctico (parser) e/ou identificar erros léxicos na entrada. Além de sua função básica, o analisador léxico em geral está encarregue de fazer algumas tarefas secundárias, designadamente, a eliminação de comentários, espaços em branco e tabulações. Um token representa um conjunto de cadeias de entrada possível e por sua vez, um lexema é uma determinada cadeia de entrada associada a um token. Considere os exemplos apresentados na tabela 1.1. O FLEX é uma ferramenta que permite gerar analisadores léxicos. Estes analisadores são capazes de reconhecer padrões léxicos em texto (e.g., números, identificadores e palavras chave de uma determinada linguagem de programação). O analisador é construído com base num conjunto de regras. Uma regra é constituída por um par, padrão acção, o padrão (expressão regular) descreve o elemento a reconhecer e acção (ou conjunto de acções) define o procedimento que será realizado no caso de identificação positiva do padrão. 1

1.2. MODO DE UTILIZAÇÃO DO FLEX 1. Introdução ao Flex Tabela 1.1: Tokens e lexemas Tokens Lexemas FOR for IF if WHILE while NÚMERO 1089, 142857, 0.2, 3.14159 IDENTIFICADOR i, j, contador, nomealuno OP_SOMA + OP_MAIOR_IGUAL >= ABRE_PAR ( 1.2 Modo de utilização do FLEX O ciclo de vida de um programa FLEX obedece à estrutura apresentada na figura 1.1. Erros de FLEX Erros de compilação Ficheiro texto n Ficheiro texto 2 Ficheiro texto 1 ficheiro fonte flex.flex FLEX ficheiro fonte C.c Compilador (gcc) programa executável Resultado n Resultado 2 Resultado 1 Figura 1.1: Ciclo de vida de um programa FLEX Com base num ficheiro fonte escrito de acordo com a sintaxe do FLEX, o programa FLEX gerará um analisador léxico descrito na linguagem C. Em caso de existirem erros de codificação, o FLEX gerará uma listagem de erros. O ficheiro fonte em C terá de ser compilado para a plataforma em utilização utilizando um compilador da linguagem C adequado (neste caso o GCC). O resultado final da compilação será um programa executável capaz de identificar os padrões definidos pelo programado e levar o conjunto de acções previsto. Como entrada para o analisador gerado podem ser fornecidos ficheiros de texto ou alternativamente fornecer os dados directamente pelo standard de entrada. No exemplo seguinte são apresentados os passos necessários à compilação e utilização de um programa FLEX. Considere se a existência de um ficheiro ficheiro.flex com o programa FLEX já escrito. 2

1. Introdução ao Flex 1.3. FORMATO DE UM FICHEIRO FLEX flex ficheiro.flex gcc lex.yy.c -lfl./a.out O comando flex gera, por omissão, um ficheiro com o nome lex.yy.c que deverá ser compilado, por exemplo com o gcc. Na utilização do gcc é necessário indicar a utilização da biblioteca FLEX adicionando o parâmetro -lfl. Por sua vez, o compilador de C gera, por omissão, um ficheiro com o nome a.out. Por último, para a execução deste programa basta a evocação do seu nome na linha de comandos. Neste caso, a introdução dos dados terá de ser realizada via consola (terminando obrigatoriamente com Ctrl+D). flex Exemplo.flex -oexemplo.c gcc Exemplo.c -o Programa -lfl./programa < Dados.txt Neste exemplo, o comando flex gera a partir do ficheiro Exemplo.flex, o ficheiro com o nome Exemplo.c que deverá ser compilado. Nesta utilização apresentada do gcc, é indicado o nome do executável a ser gerado, neste caso, Programa. Na execução do Programa, a introdução dos dados é realizada a partir do ficheiro Dados.txt. 1.3 Formato de um ficheiro FLEX Um programa em FLEX é constituído por três secções, a saber, declarações, regras e rotinas auxiliares. A separação entre as secções é feita inserindo uma linha com o símbolo %%. Considere se o seguinte exemplo que será discutido nas secções seguintes. 1 %{ 2 int numchars=0; 3 %} 4 5 %% 6 7. { 8 numchars++; 9 p r i n t f ( "%s ", yytext ) ; 10 } 11 12 \n { 13 numchars++; 14 p r i n t f ( "\n" ) ; 15 } 3

1.3. FORMATO DE UM FICHEIRO FLEX 1. Introdução ao Flex 16 17 %% 18 19 main ( ) 20 { 21 yylex ( ) ; 22 p r i n t f ( "Número de c a r a c t e r e s %d\n", numchars ) ; 23 24 } 1.3.1 Declarações Esta secção compreende duas partes: Instruções C nesta parte, delimitada pelos símbolos %{ e %}, são colocadas as instruções da linguagem C que posteriormente serão incluídas no início do ficheiro C a gerar pelo FLEX. Os exemplos mais comuns são a inclusão de ficheiros de cabeçalhos ( headers,.h), declarações de variáveis e constantes. 1 / Definição da v a r i á v e l numchars / 2 %{ 3 int numchars=0; 4 %} Expressões regulares nesta parte, podem ser declaradas macros para as expressões regulares mais comuns como por exemplo algarismo ou letra do alfabeto. 1 / Definição de macros / 2 ALGARISMO [0 9] / Algarismo / 3 ALFA [ a za Z ] / Letra do a l f a b e t o / A utilização de macros para expressões regulares será explicada com detalhe mais adiante. 1.3.2 Regras (definição de padrões e acções) Nesta secção são definidas as expressões regulares (padrões) e as respectivas acções que se pretendem realizar no caso da identificação positiva (pattern matching) do referido padrão. No caso de um qualquer carácter excepto mudança de linha (representado por. ) é incrementada a variável num_chars e impresso o referido carácter no standard de saída. A mudança de linha (representado por \n ) é também contabilizada como um carácter e escrita no standard de saída. 4

1. Introdução ao Flex 1.3. FORMATO DE UM FICHEIRO FLEX As expressões regulares têm de ser obrigatoriamente escritas na primeira coluna do ficheiro. 1. { 2 numchars++; 3 p r i n t f ( "%s ", yytext ) ; 4 } 5 6 \n { 7 numchars++; 8 p r i n t f ( "\n" ) ; 9 } Na secção 1.8 são apresentados alguns dos padrões mais relevantes utilizados pelo FLEX. o analisador léxico gerado funciona de acordo com as seguintes regras: Apenas uma regra é aplicada à entrada de dados; A acção executada corresponde à expressão que consome o maior número de caracteres; Caso existam duas ou mais expressões que consumam igual número de caracteres, tem precedência a regra que aparece em primeiro no ficheiro. Quando um padrão é reconhecido, a sequência de caracteres consumida (token) na identificação do padrão é guardada na variável yytext (do tipo char *). Para além disso, o comprimento da referida sequência é guardado na variável yyleng 1 (do tipo int). 1.3.3 Rotinas em C de suporte Nesta secção pode ser escrito o código C que se pretende que seja adicionado ao programa a gerar pelo FLEX. Tipicamente este código inclui o corpo do programa, designadamente, a função main() da linguagem C. 1 main ( ) 2 { 3 yylex ( ) ; 4 p r i n t f ( "Número de c a r a c t e r e s %d\n", numchars ) ; 5 } A função yylex() evoca o analisador léxico gerado pelo flex que processará as expressões regulares anteriormente descritas (ver secção 1.3.2). 1 O valor desta variável poderia ser obtido através da instrução da linguagem C strlen(yytext) 5

1.4. EXEMPLO MAIS ELABORADO 1. Introdução ao Flex 1.4 Exemplo mais elaborado Considere o seguinte exemplo, no qual é contabilizado a quantidade de números e de linhas existentes no ficheiro. Neste exemplo recorre se à utilização de uma macro para a definição de algarismo. 1 %{ 2 int qtdnumeros =0, nlinhas =0; 3 %} 4 5 ALGARISMO [0 9] 6 7 %% 8 9 / Se a acção f o r d e s c r i t a numa só l i n h a 10 as c h a v e t a s podem s e r omitidas / 11 12 \n nlinhas++; 13 {ALGARISMO}+ { p r i n t f ( "d %s \n", yytext ) ; qtdnumeros++} 14. 15 16 %% 17 main ( ) 18 { 19 yylex ( ) ; 20 p r i n t f ( "# l i n h a s=%d\n", nlinhas ) ; 21 p r i n t f ( "# numeros=%d\n", qtdnumeros ) ; 22 } Todos os caracteres não processados pelas duas primeiras expressões regulares são consumidos pela última à qual não corresponde nenhuma acção particular. 1.5 Propostas de exercícios a) Escrever um programa que permite contar o número de ocorrências de uma cadeia de caracteres; b) Escrever um programa que permite substituir uma cadeia de caracteres por outra; c) Escrever um programa que dado um ficheiro de texto, mostra: número de algarismos; número de letras do alfabeto; 6

1. Introdução ao Flex 1.6. AMBIENTE DE TRABALHO número de linha de texto; número de espaços ou tabulações (\t); número de caracteres não identificados nos pontos anteriores; d) Escrever um programa que permite identificar números naturais; Entrada Saída 123 abc 12.45 s 245 xyz 123 12 45 245 xyz 2 abc 45 cc 2 45 e) Escrever um programa que permite identificar números inteiros (com ou sem sinal); f) Escrever um programa que permite identificar números com parte decimal (com ou sem sinal); 1.6 Ambiente de trabalho O acesso a uma máquina LINUX pode ser realizado utilizando o programa putty que está instalado em c:putty em modo SSH (ver figura 1.2). As máquinas a utilizar deverão ser ssh, ssh1 e ssh2. Figura 1.2: Acesso SSH via putty 7

1.7. RESUMO DE COMANDOS UNIX ÚTEIS 1. Introdução ao Flex A edição dos ficheiros fonte pode ser realizada a partir de qualquer editor de texto básico (e.g., no ambiente Windows existe o Programmer s Notepad) desde que os ficheiros sejam gravados em formato Unix. 1.7 Resumo de comandos UNIX úteis Na tabela 1.2 são apresentados os comandos que permitem fazer mudança de directório e mostrar qual o directório actual. Comando cd cd.. cd <DIR> pwd Tabela 1.2: Mudar e mostrar directório Descrição Mudar para o directório home Mudar para o directório pai Mudar para o directório DIR Mostra o path do directório actual Na tabela 1.3 são apresentados os comandos que permitem listar o conteúdo de um determinado directório. Tabela 1.3: Listagem do conteúdo de um directório Comando Descrição ls ls -a ls -la ls <DIR> -l Mostra conteúdo do directório actual idem incluindo ficheiros escondidos idem incluindo ficheiros escondidos sob a forma de lista Mostra conteúdo do directório DIR sob a forma de lista Na tabela 1.4 são apresentados os comandos que permitem alterar as permissões de acesso a ficheiros e/ou directórios. As permissões podem ser de três tipos: Leitura (r) permite visualizar o conteúdo quando de se trate de ficheiros, no caso de directórios, permite fazer um ls; Escrita (w) permite alterar o conteúdo quando de se trate de ficheiros e no caso de directórios permite criar ficheiros/directórios no referido directório; Execução (x) permite executar um programa, quando de se trate de ficheiros, no caso de directórios, permite aceder aos seus conteúdos; As permissões de acesso a um ficheiro ou directório estão subdivididas por três grupos de utilizadores: 8

1. Introdução ao Flex 1.8. PADRÕES UTILIZADOS NO FLEX Tabela 1.4: Alteração de permissões de acesso de ficheiros/directórios Comando Descrição chmod u+rwx,go-rw <FICH> chmod u+rwx,go+rx <DIR> Concede as permissões rwx para o utilizador; retira as permissões rw para utilizadores do mesmo grupo e outros; as outras permissões não são alteradas Concede as permissões rwx para o utilizador; concede as permissões rx para utilizadores do mesmo grupo e outros; as outras permissões não são alteradas chmod 751 <DIR> Concede somente as permissões: rwx (7 = 4 + 2 + 1) para o utilizador, rx (5 = 4 + 1) para utilizadores do mesmo grupo e x (1) para outros utilizadores o próprio (owner); o grupo (group); restantes (other). Considere o seguinte extracto resultado da execução do comando ls -la no qual o primeiro campo faz a codificação das permissões leitura, escrita e execução (rwx) para cada grupo. Estas permissões podem ser convertidas para um valor numérico somando 4 para r, 2 para w e 1 para x. -rwxr----- 1 user profs 25 Jan 27 2002 fich drwx--x--- 4 user profs 4096 Jan 17 16:31 dir/ Neste exemplo, o ficheiro fich tem permissões de leitura, escrita e execução para o próprio, leitura para o grupo e nenhuma para os restantes utilizadores. Por sua vez, o directório dir (o primeiro carácter é um d no caso de directórios) tem permissões de leitura, escrita e execução para o próprio, execução para o grupo e nenhuma para os restantes utilizadores. 1.8 Padrões utilizados no FLEX Na tabela 1.5 são apresentados alguns dos padrões mais relevantes utilizados pelo FLEX. 9

1.8. PADRÕES UTILIZADOS NO FLEX 1. Introdução ao Flex Padrão Tabela 1.5: Padrões utilizados no FLEX Descrição x O carácter x. Qualquer carácter excepto mudança de linha \n Mudança de linha [xyz] Um dos caracteres x, y ou z xyz A cadeia de caracteres xyz [a-za-z] Um dos caracteres no intervalo de a a z ou de A a Z [-+*/] Qualquer um dos operadores -, +, * ou /, send que o símbolo - tem de aparecer em primeiro lugar dada a possibilidade de ambiguidade com a definição de intervalo [abj-oz] Um dos caracteres a, b ou de j a o ou Z [ˆA-Z\n] Qualquer carácter excepto no intervalo de A a Z ou mudança de linha r* O carácter r zero ou mais vezes r+ O carácter r uma ou mais vezes r? O carácter r zero ou uma vez r{2,5} O carácter r repetido de duas a cinco vezes r{2,} O carácter r repetido pelo menos duas vezes r{4} O carácter r repetido exactamente quatro vezes {macro} Substituição/Expansão da macro definida anteriormente (r) O carácter r, sendo que os parêntesis permitem estipular precedências xyz* A sequência xy seguida de zero ou mais z s (xyz)* A sequência xyz repetida zero ou mais vezes r s O carácter r ou s (alternativa) ˆr O carácter r apenas se no início da linha r$ O carácter r apenas se no final da linha (não consome o \n) ˆxyz$ Uma linha que contém apenas a cadeia de caracteres xyz <<EOF>> Fim de ficheiro 10