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.