Dígrafos e trígrafos - Digraphs and trigraphs

Na programação de computadores , dígrafos e trígrafos são sequências de dois e três caracteres , respectivamente, que aparecem no código-fonte e, de acordo com a especificação de uma linguagem de programação , devem ser tratados como se fossem caracteres únicos.

Existem várias razões para o uso de dígrafos e trigrafos: teclados podem não ter teclas para cobrir todo o conjunto de caracteres do idioma, a entrada de caracteres especiais pode ser difícil, editores de texto podem reservar alguns caracteres para uso especial e assim por diante. Trigraphs também podem ser usados ​​para algumas páginas de código EBCDIC que não possuem caracteres como e . {}

História

O conjunto básico de caracteres da linguagem de programação C é um subconjunto do conjunto de caracteres ASCII que inclui nove caracteres que estão fora do conjunto de caracteres invariáveis ISO 646 . Isso pode representar um problema para escrever o código-fonte quando a codificação (e possivelmente o teclado ) em uso não oferece suporte a nenhum desses nove caracteres. O comitê ANSI C inventou trígrafos como uma forma de inserir o código-fonte usando teclados que suportam qualquer versão do conjunto de caracteres ISO 646.

Implementações

Trigraphs não são comumente encontrados fora dos conjuntos de teste do compilador . Alguns compiladores oferecem suporte a uma opção para desativar o reconhecimento de trigraphs ou desabilitar trigraphs por padrão e exigem uma opção para ativá-los. Alguns podem emitir avisos quando encontram trigraphs nos arquivos de origem. A Borland forneceu um programa separado, o pré-processador trigraph ( ), para ser usado apenas quando o processamento trigraph é desejado (a lógica era maximizar a velocidade de compilação). TRIGRAPH.EXE

Suporte de linguas

Diferentes sistemas definem diferentes conjuntos de dígrafos e trígrafos, conforme descrito abaixo.

ALGOL

As primeiras versões do ALGOL são anteriores aos conjuntos de caracteres ASCII e EBCDIC padronizados e foram normalmente implementadas usando um código de caracteres de seis bits específico do fabricante . Várias operações ALGOL não tinham pontos de código no conjunto de caracteres disponíveis ou não eram suportadas por periféricos, levando a uma série de substituições, incluindo :=para (atribuição) e >=para (maior ou igual).

Pascal

O Pascal linguagem de programação suporta dígrafos (., .), (*e *)para [, ], {e }respectivamente. Ao contrário de todos os outros casos mencionados aqui, (*e *)foram e ainda estão em ampla utilização. No entanto, muitos compiladores os tratam como um tipo diferente de bloco de comentário em vez de dígrafos reais, ou seja, um comentário iniciado com (*não pode ser fechado com }e vice-versa.

J

A linguagem de programação J é descendente de APL, mas usa o conjunto de caracteres ASCII em vez de símbolos APL . Como o intervalo de impressão do ASCII é menor do que o conjunto especializado de símbolos do APL, os caracteres .(ponto) e :(dois pontos) são usados ​​para flexionar os símbolos ASCII, interpretando efetivamente unígrafos, dígrafos ou raramente trigraphs como "símbolos" autônomos.

Ao contrário do uso de dígrafos e trígrafos em C e C ++ , não há equivalentes de um único caractere para estes em J.

C

Trigraph Equivalente
??= #
??/ \
??' ^
??( [
??) ]
??! |
??< {
??> }
??- ~

O pré-processador C (usado para C e com pequenas diferenças em C ++ ; veja abaixo ) substitui todas as ocorrências das nove sequências de trígrafos nesta tabela por seus equivalentes de um único caractere antes de qualquer outro processamento.

Um programador pode querer colocar dois pontos de interrogação juntos, mas não fazer com que o compilador os trate como a introdução de um trígrafo. A gramática C não permite dois ?tokens consecutivos , portanto, os únicos lugares em um arquivo C onde dois pontos de interrogação em uma linha podem ser usados ​​são em constantes de vários caracteres, literais de string e comentários. Isso é particularmente um problema para o Mac OS clássico , onde a constante '????'pode ser usada como um tipo de arquivo ou criador. Para colocar com segurança dois pontos de interrogação consecutivos em um literal de string, o programador pode usar a concatenação de string "...?""?..."ou uma sequência de escape "...?\?..." .

???não é em si uma sequência de trígrafos, mas quando seguida por um caractere como -, será interpretada como ?+ ??-, como no exemplo abaixo, que tem 16 ?s antes de /.

O ??/trígrafo pode ser usado para introduzir uma nova linha de escape para emenda de linha; isso deve ser levado em consideração para o manuseio correto e eficiente de trigraphs no pré-processador. Também pode causar surpresas, principalmente nos comentários. Por exemplo:

 // Will the next line be executed????????????????/
 a++;

que é uma única linha de comentário lógica (usada em C ++ e C99 ), e

 /??/
 * A comment *??/
 /

que é um comentário de bloco formado corretamente. O conceito pode ser usado para verificar trigraphs como no exemplo C99 a seguir, onde apenas uma instrução de retorno será executada.

int trigraphsavailable() // returns 0 or 1; language standard C99 or later
{
	// are trigraphs available??/
	return 0;
	return 1;
}
Digrafos alternativos introduzidos no padrão C em 1994
Dígrafo Equivalente
<: [
:> ]
<% {
%> }
%: #

Em 1994, uma emenda normativa ao padrão C, incluída no C99, forneceu dígrafos como alternativas mais legíveis para cinco dos trigrafos.

Ao contrário dos trígrafos, os dígrafos são tratados durante a tokenização e qualquer dígrafo deve sempre representar um token completo por si só ou compor o token %:%:substituindo o token de concatenação do pré-processador ##. Se uma sequência de dígrafo ocorrer dentro de outro token, por exemplo, uma string entre aspas ou uma constante de caractere, ela não será substituída.

C ++

Símbolo Equivalente
compl ~
not !
bitand &
bitor |
and &&
or ||
xor ^
and_eq &=
or_eq |=
xor_eq ^=
not_eq !=

C ++ (até C ++ 14 , veja abaixo ) se comporta como C, incluindo as adições de C99, mas com tokens adicionais listados na tabela.

Como observação, %:%:é tratado como um único token, em vez de duas ocorrências de %:.

O padrão C ++ faz este comentário em relação ao termo "dígrafo":

O termo "dígrafo" (token consistindo em dois caracteres) não é perfeitamente descritivo, uma vez que um dos tokens de pré-processamento alternativos é %:%:e, claro, vários tokens primários contêm dois caracteres. No entanto, esses tokens alternativos que não são palavras-chave lexicais são coloquialmente conhecidos como "dígrafos".

Trigraphs foram propostos para depreciação em C ++ 0x , que foi lançado como C ++ 11 . A IBM se opôs , falando em nome de si mesma e de outros usuários do C ++ e, como resultado, os trigraphs foram mantidos no C ++ 11. Trígrafos foram então propostos novamente para remoção (não apenas depreciação) em C ++ 17 . Ele passou por uma votação do comitê e trigraphs (mas não os tokens adicionais) foram removidos do C ++ 17, apesar da oposição da IBM. O código existente que usa trigraphs pode ser compatível com a tradução dos arquivos de origem (análise de trigraphs) para o conjunto de caracteres de origem básico que não inclui trigraphs.

RPL

As calculadoras Hewlett-Packard que suportam a linguagem RPL e o método de entrada fornecem suporte para um grande número de trígrafos (também chamados de códigos TIO ) para transcrever de forma confiável caracteres ASCII diferentes de sete bits do conjunto de caracteres estendidos das calculadoras em plataformas estrangeiras e para facilitar o teclado entrada sem usar o aplicativo CHARS . O primeiro caractere de todos os códigos TIO é um \, seguido por dois outros caracteres ASCII vagamente semelhantes ao glifo a ser substituído. Todos os outros caracteres podem ser inseridos usando a \nnnsintaxe de código TIO especial com nnn sendo um número decimal de três dígitos (com zeros à esquerda, se necessário) do ponto de código correspondente (portanto, formalmente representando um tetrógrafo ).

Suporte de aplicativo

Vim

O editor de texto Vim oferece suporte a dígrafos para a entrada real de caracteres de texto, de acordo com a RFC  1345 . A entrada de dígrafos está vinculada a Ctrl+ Kpor padrão. A lista de todos os dígrafos possíveis no Vim pode ser exibida digitando :dig.

Tela GNU

GNU Screen tem um comando digraph, vinculado a Ctrl+ A Ctrl+ Vpor padrão.

Lótus

O Lotus 1-2-3 para DOS usa Alt+ F1como tecla de composição para permitir a entrada mais fácil de muitos caracteres especiais do Lotus International Character Set (LICS) e do Lotus Multi-Byte Character Set (LMBCS).

Veja também

Referências

links externos