next up previous contents index
Next: Representação de Tipos Up: Gerador de Descrições Previous: Gerador de Descrições

Representação de Tipos Básicos

Definem-se como básicos aqueles tipos que não resultam da composição de outros tipos. A qualificação de um tipo, e.g. com unsigned não constitui composição. Utilizando esta definição, classes e estruturas não são tipos básicos, tal como não o são vectores de posições de memória. Tipos de dados enumerados não são considerados básicos, embora não resultem da composição de outros tipos.

A gramática de CIDL tenta seguir a de C++, mas é algo mais restritiva, pelo que não será surpresa a constatação de que os tipos das duas linguagens são diferentes. Mesmo a tradução de tipos básicos não é um processo trivial devido à falta de equivalências directas entre os dois conjuntos. Em particular, a utilização de int para designar um inteiro é ilegal em CIDL, devendo ser utilizado short ou long; caracteres (char) não podem ser qualificados com signed nem com unsigned.

As deficiências de emparelhamento de tipos podem fazer ocorrer alguns problemas graves e de difícil solução. Considere-se o exemplo da conversão de um inteiro C++, int, para um CIDL, long, e de novo para C++, long. Houve perda de informação. Se na maior parte dos casos essa perda pode ser resolvida pelos mecanismos de conversão implícita de tipos da linguagem, existem casos em que a diferença pode provocar comportamentos incorrectos, e.g. duas funções que difiram apenas no tipo de um argumento, uma int e a outra long, passam a ser ambas long...

  
Figure: Conflitos na conversão de C++/CIDL/C++.

Neste protótipo não se resolveu o conflito. Para o resolver, poder-se-iam definir tipos adicionais, um para cada combinação que pudesse ocorrer no ficheiro de entrada e reconhecê-lo na fase final de geração e gerar código capaz de o restaurar. Esta solução é análoga a que se usa para representar envelopes (secção 6.3.3.3).



David M. M. de Matos
Thu Jun 29 14:58:09 MET DST 1995