Métodos de Programação III LESI, Universidade do Minho Ano lectivo 2006/20037 Trabalho Prático No 1 BibTeX–: Processador de Bases de Dados Bibliográficas Grupo: 55436 40000 33333 LESI MCC MCC Ana Tó Zé Neste trabalho prático pretende-se que os alunos implementem um processador para modelar um sistema de bases de dados bibliográficas. Este processador deverá validar léxica, sintáctica e semanticamente uma base de dados bibliográfica definida na linguagem textual BibTeX --. Para além destas validações, o processador deverá produzir um documento (e.g., HTML, ASCII, etc) contendo um representação facilmente compreensı́vel (i.e., ”pretty printed”) da base de dados. Entrega do Trabalho: Constituição dos Grupos: Linguagem de Prog.: data a anúnciar Os grupos terão obrigatoriamente 3 elementos Haskell ou qualquer outra lnguagem de programação O enúnciado do trabalho prático está escrito em literate Haskell. Isto é, pode ser interpretado como um documento LATEX ou como um programa numa qualquer linguagem de programação. Resolva este trabalho prático neste mesmo ficheiro de modo a implementar o programa e a sua documentação. 1 A Linguagem BibTeX -- A linguagem BibTeX -- é uma linguagem textual, de domı́nio especı́fico que permite representar registos de uma base de dados bibliográfica. Esta linguagem é uma versão simplificada (e ”aportuguesada”) da linguagem BibTeX, usada usualmente em conjunto com 1 o processador LATEX. BibTeX --tem-se tornado num standard de facto para representar bases de dados bibliográfica. Em BibTeX --, um registo nesta base de dados consiste de três coisas: um tipo, uma chave de citação e uma lista de campos. O tipo especifica se a entrada é uma referência para um livro (denotado pela palavra reservada livro), para um artigo (denotado pela palavra reservada artigo), para umas actas de um conferêcnia (actas), ou para uma publicação numas actas (emactas). A chave de citação é um identificador único que permite as citações possı́veis. A lista de campos define os vários atributos do registo bibliográfico. Um atributo é um par nome/valor. Em BibTeX -- existe um conjunto pre-definido de atributos, nomeadamente: titulo, autor, editora, ano, paginas, ano, revista, editores. Estes campos podem aparecer todos, ou apenas alguns, num registo bibliográfico. Nesta linguagem existe ainda um constructor para definir abreviaturas que são posteriormente usadas nos registos da base de dados. Por exemplo, PH = "Prentice Hall" define a abreviatura PH, que tem valor "Prentice Hall". Uma frase em BibTeX -- apresenta-se a seguir: PH = "Prentice Hall" SPJ = "Simon Peyton Jones" livro : { ; ; ; } Bird98 titulo autor editora ano = = = = "Introduction to Functional Programming using Haskell" {Richard Bird} PH "1998" artigo : HaskellReport98 { titulo = "Report on the Programming Language Haskell 98" ; autor = SPJ ; ano = "1998" } Isto é, o tipo é separado da chave de citação pelo caracter ’:’. A lista de campos é delimitada pelos caracteres ’{’ e ’}’ e os campos são separados por ’;’. Um campo é denotado pelo seu tipo seguido do caracter ’=’ e do valor. O valor de um campo é uma de duas coisas: uma sequência de caracteres delimitada por ’”’ ou ’{’ ’}’, ou o identificador (i.e., uma string de caracteres) de uma abreviatura. 1.1 Regras Semânticas As regras semânticas da linguagem são: • Não é permitida a existência de chaves repetidas na base de dados. 2 • Num registo não podem existir campos repetidos. • A ordem dos campos num registo é arbitrária. • As abreviaturas podem ser referidas nos campos antes da sua definição. No entanto, só é possı́vel referir abreviaturas que estejam definidas na base de dados. 2 O Processador a Desenvolver Pretende-se desenvolver um processador de BibTeX -- para fazer a gestão de bases de dados bibliográficas e produzir um documento contendo os vários registos da base de dados. As tarefas que este processador deverá efectuar são as seguintes: • Efectuar o reconhecimento léxico e sintáctico da linguagem BibTeX --. • Efectuar o reconhecimento semântico da linguagem BibTeX -- e sinalizar os registos que violam as regras semânticas da linguagem. • Produzir um documento para um fácil consulta/visualização da base de dados. Isto é, produzir um documento em ASCII, HTML ou LATEX com as entradas bibliográficas. Neste documento, as abreviaturas usadas nos campos são substituı́das pelo seu real valor. A definição das abreviaturas não aparece neste documento. Por exemplo, um resultado ASCII possı́vel deste processador dado a frase BibTeX -anterior será: - Introduction to Functional Programming using Haskell, Richard Bird, Prentice Hall, 1998 - Report on the Programming Language Haskell 98, Simon Peyton Jones, 1998 Numa representação em HTML podemos considerar o uso de fontes e cores para os diferentes campos de um registo. 3 Gramáticas Independentes do Contexto A gramática independente de contexto que define a estrutura concreta de uma frase na linguagem é a seguinte: 3 G = (T, N, S, P ), com T = {...}, N = {bibtex, bibentries, ...}, S = bibtex, P = { p0 : bibtex → bibentries , p1 : bibentries → , p2 bibentry bibentries , ... } A estrutura abstracta da linguagem é definida pela seguinte gramática abstracta: G = (T, N, S, P ), com T = {...}, N = {Bibtex, Bibentries, ...}, S = Bibtex, P = { RaizBibT ex : Bibtex → Bibentries , ... Bibentries → ... , ... } 4 Estrutura do Processador de BibTeX -- No desenvolvimento do processador BibTeX --, estruturamos o código da seguinte forma: Código --- Processador de BibTeX----- Métodos de Programaç~ ao III -- 2006/2007 -module BibTeX where import Char import Parser import Html 4.1 -- Combinadores de Parsing -- Combinadores de HTML Combinadores de Parsing Adicionais O parser de BibTeX --foi construı́do utilizando a biblioteca de combinadores apresentada nas aulas teóricas e teório-práticas. 4 Porém, com linguagem bibtex– possuı́ construções sintácticas usuais noutras linguagens que podem ser facilmente definidas por (novos) combinadores. Assim, construı́mos os os seguinte combinadores adicionais: Código 5 Árvore de Sintaxe Abstracta O tipo da árvore de sintaxe abstracta deriva-se facilmente da gramática abstracta. O tipo de dados abstracto ... Código -- data BibTeX = ... 6 Parsing e Construção da Árvore de Sintaxe Abstracta Nesta secção apresentamos o parser, basedado em combinadores, que constroi a árvore de sintaxe abstracta. Código 7 Análise Semântica 8 Pretty Printing De modo a gerarmos uma representação ”pretty printed”(alindada) da base de dados bibliográfica utilizamos os combinadores de Html fornecidos de modo a produzirmos uma representação em Html da base de dados. Código 5 9 O Processador bibTeX– De modo a produzirmos um processador autónomo construı́mos uam função main que permite correr o processador em modo batch, aceitando diferentes opções de acordo com a seguinte sinopsys: ... Código Para processarem a linha de comandos utilizem a biblioteca getOpt: ver a função main da ferramenta HaLeX. Ou utilizem autómatos reactivos (ver extras). 10 Exemplos de utilização 11 Extras ao trabalho prático 1. Validação dos Campos de um Registo: Na linguagem BibTeX -- considerada anteriormente nada é referido sobre quais os campos obrigatórios e opcionais de um registo bibliográfico. Porém, para cada tipo de registo existem campos obrigatórios (por exemplo, para o tipo livro podemos considerar que é obrigatório definir o autor, o tı́tulo e editora) e outros opcionais (por exemplo, o ano e as páginas de um livro poderão ou não ser incluı́dos no registo de um livro). Neste extra ao trabalho pretende-se que assuma para cada tipo de entrada os conjuntos de campos obrigatórios e opcionais. O processador deverá indicar quais os registos que não contém todos os campos obrigatórios e, nesse caso, quais os campos em falta. 2. Utilização de um Formato de Estilos: De modo a permitir alterar o formato da representação HTML e LATEX da base de dados, pretende-se parameterizar o processador de BibTeX -- com um formato de estilos. Este formato textual permite definir facilmente como são ”mostrados”os vários campos de cada tipo de registos. Por exemplo, para cada tipo de campo obrigatório define-se a fonte e cor com que esse campo é representado em HTML e LATEX. Por exemplo, uma possı́vel notação para definir o estilo será: livro [autor(it),titulo(bold,cor="red"),editora,ano] artigo [autor(it),titulo(it),revista(it),paginas,ano] actas [autor,titulo(it),editora,editores,ano] Neste ficheiro indica-se para cada tipo de registo (e.g., livro) quais os campos obrigatórios que aparecem na saı́da e os atributos com que são ”mostrados (e.g., it indica 6 que o campo é mostrado em itálico, etc). Por outro lado, a sequência de campos no ficheiro de estilos, indica a ordem pelo qual os campos são mostrados. 3. Invocaçao do Processador: A notação utilizada para invocar na linha de comandos um programa e passar-lhe opções é uma linguagem regular. Esta linguagem pode ser facilmente ser definida por um automato reactivo. Assim, devem utilizar autómatos reactivos para modelar a linha de comandos especifica do vosso processador BibTeX --. 4. Combinadores de Pretty Print: De modo a produzirmos uma versão ASCII da biblioteca, pretende-se que utilizem uma biblioteca de combinadores de pretty print. Essa biblioteca é distribuı́da com esta trabalho. Um exemplo da sua utilização encontra-se nos combinadores de Html: a geração de texto Html é feito recorrendo a esses combinadores. Ver função renderHtml no módulo Html. No ficheiro README encontra-se um url com um manual de utilização destes combinadores. 5. Scanner via Autómatos Reactivos: A linguagem BibTeX --apresentada é um subconjunto apenas de BibTeX. A parte mais complicada da análise de BibTeX é a sua análise léxica, pois os campos de um registo podem conter os próprios delimitadores. Na subdirectoria scanner apresenta-se uma função em Haskell que efectua o scanning completo de BibTeX. Pretende-se nest trabalho, modelar essa função com um autómato reactivo que tem exactamente o mesmo comportamento. Nessa directoria incluı́-se ainda um gramática independente de contexto para BibTeX completa. Devem modelar essa gramica com combinadores de parsing de modo a terem um processador de BibTeX completo! O ficheiro AG.bib é um bom exemplo de entrada para testarem o processador contruı́do... 7