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.
As regras gerais são as mais simples e as que deverão mais utilizadas.
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.
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;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 → STREsta 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 → strQuando 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.