# Digrammi e trigrammi

In programmazione, i digrammi e trigrammi sono sequenze rispettivamente di due o tre caratteri che appaiono nel codice sorgente e, secondo le specifiche dei linguaggi di programmazione dove sono presenti, dovrebbero essere trattate come se fossero caratteri singoli.
Esistono vari motivi per utilizzare digrammi e trigrammi. Ad esempio: le tastiere potrebbero non avere tasti per coprire l'intero set di caratteri della lingua, l'inserimento di caratteri speciali potrebbe essere difficile, gli editor di testo potrebbero riservare alcuni caratteri per usi speciali e così via. I trigrammi potrebbero essere usati anche per alcuni sistemi di codifica EBCDIC che mancano di caratteri come { e }.

## Storia

Il set di caratteri di base del linguaggio di programmazione C è un sottoinsieme del set di caratteri ASCII che include nove caratteri che si trovano al di fuori del set di caratteri invarianti ISO 646. Ciò può rappresentare un problema per la scrittura del codice sorgente quando la codifica (e possibilmente la tastiera) utilizzata non supporta nessuno di questi nove caratteri. Il comitato ANSI C ha inventato i trigrammi come modo per inserire il codice sorgente utilizzando tastiere che non supportano alcuna versione del set di caratteri ISO 646.

## Implementazioni

I trigrammi non si incontrano comunemente al di fuori delle suite di test del compilatore. Alcuni compilatori supportano un'opzione per disattivare il riconoscimento dei trigrammi o disabilitarli per impostazione predefinita e richiedono un'opzione per attivarli. Alcuni possono emettere avvisi quando incontrano trigrammi nei file sorgente. Borland ha fornito un programma separato, il preprocessore trigraph (TRIGRAPH.EXE), da utilizzare solo quando si desidera l'elaborazione dei trigrammi (la logica era massimizzare la velocità di compilazione).

## Supporto dei linguaggi di programmazione

Sistemi diversi definiscono diversi set di digrammi e trigrammi, come descritto di seguito.

### ALGOL

Le prime versioni di ALGOL erano antecedenti ai set standardizzati di caratteri ASCII ed EBCDIC e venivano tipicamente implementate utilizzando un codice di caratteri a sei bit specifico del produttore. Un certo numero di operazioni ALGOL mancava di codepoint nel set di caratteri disponibile o non erano supportate dalle periferiche, portando a un numero di sostituzioni tra cui := per ← (assegnazione) e >= per ≥ (maggiore o uguale).

### Pascal

Il linguaggio di programmazione Pascal supporta i digrammi (., .), (* e *) per [, ], { e }. A differenza di tutti gli altri casi qui menzionati, (* e *) erano e sono ancora ampiamente utilizzati. Tuttavia, molti compilatori li trattano come un diverso tipo di blocco dei commenti piuttosto che come dei veri e propri digrammi, cioè un commento che inizia con (* non può essere chiuso con } e viceversa.

### J

Il linguaggio di programmazione J è un discendente di APL ma utilizza il set di caratteri ASCII anziché i simboli APL. Poiché l'insieme di caratteri stampabili ASCII è più piccolo dell'insieme specializzato di simboli APL, i caratteri . (punto) e : (due punti) vengono utilizzati per declinare i simboli ASCII, interpretando efficacemente unigrammi, digrammi o raramente trigrammi come "simboli" autonomi.
A differenza dell'uso di digrammi e trigrammi in C e C++, non ci sono singoli caratteri equivalenti a questi in J.

### C

Il preprocessore C sostituisce tutte le occorrenze delle seguenti nove sequenze di trigrammi con i loro equivalenti a carattere singolo prima di qualsiasi altra elaborazione.
| Trigramma | Equivalente |
Un programmatore potrebbe voler mettere insieme due punti interrogativi ma non farli trattare dal compilatore come se introducessero una sequenza trigramma. La grammatica C non consente due token ? consecutivi, quindi gli unici punti in un file C in cui è possibile utilizzare due punti interrogativi in una riga sono costanti a più caratteri, stringhe letterali e commenti. Questo è un problema soprattutto per il classic Mac OS, dove la costante '????' può essere utilizzata come tipo di file o creatore. Per posizionare in modo sicuro due punti interrogativi consecutivi all'interno di una stringa letterale, il programmatore può utilizzare la concatenazione di stringhe "...?""?..." o una sequenza di escape ". . . ? \? . . .".
??? non è di per sé una sequenza trigramma, ma quando è seguita da un carattere come - sarà interpretata come ? + ??-, come nell'esempio sotto che ha 16 ? s prima di /.
Il trigramma ??/ può essere utilizzato per introdurre una nuova riga con un carattere di escape per la giunzione di linea; questo deve essere tenuto in considerazione per una corretta ed efficiente gestione dei trigrammi all'interno del preprocessore. Può anche causare sorprese, in particolare nei commenti. Per esempio:
che è una singola riga di commento logico (utilizzata in C++ e C99) e
il quale è un commento di blocco sintatticamente corretto. Il concetto può essere utilizzato per verificare la presenza di trigrammi come nel seguente esempio C99, dove verrà eseguita solo un'istruzione return.
Digrammi alternativi introdotti nel 1994 :
| Digramma | Equivalente |
Nel 1994, una modifica normativa allo standard C, inclusa nello standard C99, ha fornito i digrammi come alternativa più leggibile a cinque dei trigrammi.
A differenza dei trigrammi, i digrammi vengono gestiti durante la tokenizzazione e qualsiasi digramma deve sempre rappresentare un token completo da solo o comporre il token %:%: sostituendo il token di concatenazione del preprocessore ##. Se una sequenza di digrammi si verifica all'interno di un altro token, ad esempio una stringa tra virgolette o una costante di carattere, non verrà sostituita.

### C++

Il linguaggio C++ (fino alla versione C++14, vedi sotto) si comporta come il C, incluse le aggiunte dello standard C99, però con i token aggiuntivi presenti nella tabella seguente.
| Token | Equivalente |
| compl | ~ |
| not | ! |
| bitand | & |
| bitor | | |
| and | && |
| or | || |
| xor | ^ |
| and_eq | &= |
| or_eq | |= |
| xor_eq | ^= |
| not_eq | != |
Si può notare che %:%: viene considerato come un singolo token, anziché due occorrenze di %:
Lo standard C++ fa questo commento riguardo al termine "digraph":
«The term "digraph" (token consisting of two characters) is not perfectly descriptive, since one of the alternative preprocessing-tokens is %:%: and of course several primary tokens contain two characters. Nonetheless, those alternative tokens that aren't lexical keywords are colloquially known as "digraphs".»
«Il termine "digramma" (token formato da due caratteri), non descrive perfettamente questi token, poiché uno dei token di pre-elaborazione alternativi è %:%: e ovviamente diversi token primari contengono due caratteri. Tuttavia, quei token alternativi che non sono parole chiave lessicali sono conosciuti colloquialmente come "digrammi".»
I trigrammi sono stati proposti per la deprecazione in C++0x, che è stato rilasciato come C++11. A questo l'azienda IBM si è opposta, parlando a nome di se stessa e di altri utenti di C++, e di conseguenza i trigrammi sono stati mantenuti in C++11. I trigrammi però sono stati quindi proposti di nuovo per la rimozione (non solo per la deprecazione) in C++17. La votazione della commissione stavolta è passata e i trigrammi (ma non i token aggiuntivi) sono stati rimossi da C++17 nonostante l'opposizione di IBM. Il codice esistente che utilizza i trigrammi può essere supportato effettuando la traduzione dei file sorgente (effettuando il parsing dei trigrammi) ottenendo file che contengono solo caratteri di base e non più trigrammi.

### RPL

Le calcolatrici Hewlett-Packard che supportano il linguaggio RPL e il metodo di immissione forniscono supporto per un gran numero di trigrammi (chiamati anche codici TIO) per trascrivere in modo affidabile i caratteri ASCII non a sette bit del set di caratteri estesi su piattaforme straniere e per facilitare l'input da tastiera senza utilizzare l'applicazione CHARS.
Il primo carattere di tutti i codici TIO è \, seguito da altri due caratteri ASCII che somigliano vagamente al glifo da sostituire. Tutti gli altri caratteri possono essere inseriti utilizzando la speciale sintassi TIO\nnncon nnn un numero decimale a tre cifre (con zeri iniziali se necessario) del punto di codice corrispondente (quindi rappresenta formalmente un tetragrammo).

## Supporto delle applicazioni
### Vim

L'editor di testo Vim supporta i digrammi per l'immissione effettiva di caratteri di testo, a seguito della RFC 1345. L'immissione dei digrammi è associata a Ctrl+K per impostazione predefinita. L'elenco di tutti i possibili digrammi in Vim può essere visualizzato digitando :dig.

### Schermo GNU

GNU Screen ha un comando con un digramma, associato a Ctrl+A Ctrl+V per impostazione predefinita.

### Lotus

Lotus 1-2-3 per DOS utilizza Alt+F1 come tasto di composizione per consentire l'immissione più semplice di molti caratteri speciali di Lotus International Character Set (LICS) e Lotus Multi-Byte Character Set (LMBCS).