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
Download

Métodos de Programaç˜ao III