Apêndice C. Conversão de DTDs para Gramáticas

Índice
C.1. Regras gerais
C.2. Conversão de declarações de elementos
C.3. Regras para os atributos
C.4. Regras de conversão para entidades
C.5. Uma conversão passo a passo

Um dos contributos desta dissertação foi a sistematização da conversão de um DTD SGML para uma Gramática de Atributos. A primeira aproximação a esta sistematização foi feita na tese de mestrado de Alda Lopes [Lop98]. A versão de então revelou-se insuficiente e com algumas lacunas quando aplicada aos casos de estudo. Houve, portanto, necessidade de refinar aquele primeiro estudo e proceder à correcção de vários problemas e a uma maior generalização do conjunto de regras de conversão. O resultado final apresenta-se neste apêndice e deve ser interpretado como um manual de instruções para a realização ou implementação de uma conversão.

Algumas destas regras podem parecer simples e são-no, mas há algumas que não o são. Pretende-se uma primeira versão de uma especificação formal da conversão de DTDs em Gramáticas.

O leitor atento perceberá também facilmente que este estudo dá uma visão interior do SGML ajudando a perceber o porquê de certas características e a sua semântica.

As regras apresentadas encontram-se agrupadas por classes correspondendo cada classe a uma secção.

Assim temos um conjunto de regras gerais, que serão aplicadas a todas as declarações. Depois temos dois grupos de regras um para aplicar às declarações de elementos e outro para aplicar às declarações de atributos. A conversão da declaração de um elemento num conjunto de produções é um processo de cálculo recursivo: a expressão de conteúdo de um elemento pode ser composta por várias subexpressões aninhadas e às quais estão aplicados vários operadores com diferentes prioridades; o agrupamento e a prioridade dos operadores tem que ser captado na gramática. Este problema é semelhante ao do cálculo de uma expressão aritmética onde é preciso ter em conta a precedência e a associatividade dos operadores pelo que a solução implementada anda muito próxima da de um calculador de expressões matemáticas só que o cálculo é o de uma gramática de atributos.

No que se segue, seja Conv() a função correspondente à aplicação recursiva das regras enunciadas.

C.1. Regras gerais

As regras gerais são as mais simples e as que deverão mais utilizadas.

C.1.1. Elemento genérico

Seja elem um elemento declarado no DTD e Content a expressão de conteúdo que o define:

<!ELEMENT elem  Content>

Independentemente de ter atributos associados ou não, a correspondente produção gramatical é:

           elem → elemAttList elemContent

onde elemContent é o símbolo não-terminal que representa todo o seu conteúdo e elemAttList o símbolo não-terminal correspondente à declaração da lista de atributos de elem.

C.1.2. Elemento sem atributos

Se elem não tiver nenhum atributo declarado, elemAttList deriva na produção vazia:

          elemAttList → &egr;

Esta é a situação inicial pois primeiro surge a declaração do elemento e só mais tarde,no DTD, surge a declaração dos atributos daquele elemento. Nessa altura, esta produção é reescrita de acordo com a regra aplicada e que tem a ver com o tipo de atributo.


Exemplo C-1. Elemento Titulo sem atributos

          Title → TitleAttList TitleContent    
          TitleAttList → &egr;

C.1.3. Elemento com conteúdo #PCDATA

Se o conteúdo de um elemento for atómico, do tipo #PCDATA, elemContent terá a seguinte derivação:

          elemContent → textList

          textList → text textList
                   | &egr;
         
          text → STR

Esta regra é assim apenas inicialmente. Há situações que irão provocar a sua reescrita (para completar as alternativas de text), como a inclusão de secções marcadas ou a definição de entidades no DTD (ver Secção C.4).


Exemplo C-2. Elemento com conteúdo #PCDATA

O conteúdo do elemento Begin-date está definido como #PCDATA no DTD do serviço noticioso, o que faz com que este seja derivável nas seguintes produções:

          Begin-date → Begin-dateAttList Begin-dateContent

          Begin-dateContent → textList

          textList → text textList
                   | &egr;
         
          text → str


C.1.4. Elemento definido como um grupo - ()

Quando o conteúdo do elemento em definição não é atómico, #PCDATA, é definido por um grupo de elementos (um ou mais entre parentesis).

Nesse caso, o conjunto de produções em que deriva o conteúdo é:

          elemContent → GrupoX

          GrupoX → Conv(elemContent)

Em que GrupoX é um símbolo não-terminal introduzido pela regra e cujo nome é formado pela string "Grupo" concatenada com o valor de um contador interno X que logo é incrementado.

Às vezes, os grupos são singulares, elemContent é constituído apenas por um elemento. Neste caso, esta regra poderá ser abreviada fundindo as duas produções apresentadas.