Trigraphes

Le C est apparu de manière contemporaine à l’ASCII, et certains constructeurs, hostiles à cet encodage tel que IBM ne proposaient pas de claviers permettant de taper tous les caractères de la grammaire du C.

Il était également commun sur de nombreux ordinateurs d’avoir un nombre réduit de touches, plus ou moins équivalent à une machine à écrire Remmington.

Dans ces claviers il était courant que les caractères apportés par l’ASCII servant au multilinguisme tels que ^ ou ~, ou purement graphiques tels que |, \ ou {} soient absents.

Voici la liste des trigraphes et leur substitution associée.

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

Les trigraphes sont remplacés lors de la première phase de la traduction du code source.

Par commodité, les trigraphes les plus utiles possèdent des digraphes

Digraphe Equivalent ASCII
<: [
:> ]
<% {
%> }
%: #

qui eux sont consiérés comme des lexèmes du langage C et ne sont pas remplacés.

Test

On peut tester le support des trigraphes par le compilateur avec le code suivant

int trigraphes_supportes()
{

    // ??/
    return 0;
    return 1;
}

La substitution des trigraphes a lieu avant l’aglomération des lignes, donc après la phase 1, on obtiendrait

int trigraphes_supportes()
{

    // \
    return 0;
    return 1;
}

après la 1ère phase et

int trigraphes_supportes()
{

    //     return 0;
    return 1;
}

après la seconde. La fonction retournera 1.

Si les trigraphes ne sont pas supportés la fonction retournera 0 et générera un avertissement du compilateur.