Digraphs og trigraphs - Digraphs and trigraphs

I dataprogrammering er digraphs og trigraphs sekvenser på henholdsvis to og tre tegn som vises i kildekoden og, i henhold til spesifikasjonen til et programmeringsspråk , skal behandles som om de var enkelttegn.

Det finnes forskjellige grunner til å bruke digrafer og trigrafer: tastaturer har kanskje ikke nøkler for å dekke hele tegnsettet på språket, det kan være vanskelig å skrive inn spesialtegn, tekstredigerere kan reservere noen tegn for spesiell bruk og så videre. Trigraphs kan også brukes for noen EBCDIC kodesett som mangler figurer som {og }.

Historie

Det grunnleggende tegnsettet til C -programmeringsspråket er en delsett av ASCII -tegnsettet som inneholder ni tegn som ligger utenfor ISO 646 -varianten. Dette kan utgjøre et problem når du skriver kildekoden når kodingen (og muligens tastaturet ) som brukes, ikke støtter noen av disse ni tegnene. Den ANSI C komiteen oppfunnet trigraphs som en måte å legge inn kildekoden ved hjelp av tastaturer som støtter alle versjoner av ISO 646 tegnsett.

Implementeringer

Trigraphs er ikke vanlig forekommende utenfor kompilatoren testsuiter . Noen kompilatorer støtter et alternativ for å slå på gjenkjenning av trigrafer, eller deaktivere trigrafer som standard og krever et alternativ for å slå dem på. Noen kan gi advarsler når de støter på trigrafer i kildefiler. Borland leverte et eget program, trigraph preprocessor ( TRIGRAPH.EXE), som bare skal brukes når trigraph -behandling er ønsket (begrunnelsen var å maksimere kompilasjonshastigheten).

Språkstøtte

Ulike systemer definerer forskjellige sett med digrafer og trigrafer, som beskrevet nedenfor.

ALGOL

Tidlige versjoner av ALGOL var forut for de standardiserte ASCII- og EBCDIC-tegnsettene, og ble vanligvis implementert ved bruk av en produsentspesifikk seks-biters tegnkode . En rekke Algol operasjoner, enten manglet codepoints i de tilgjengelige tegnsettet eller som ikke er støttet av eksterne enheter, som fører til en rekke substitusjoner blant annet :=for (tilordning) og >=for (større enn eller lik).

Pascal

Den Pascal programmeringsspråk støtter digraphs (., .), (*og *)for [, ], {og }henholdsvis. I motsetning til alle andre saker nevnt her, (*og *)var og er og er fortsatt i stor bruk. Imidlertid behandler mange kompilatorer dem som en annen type kommentarblokk i stedet for som faktiske utgravninger, det vil si at en kommentar som startes med (*ikke kan lukkes med }og omvendt.

J

Programmeringsspråket J er en etterkommer av APL, men bruker ASCII -tegnsettet i stedet for APL -symboler . Fordi det utskrivbare området for ASCII er mindre enn APLs spesialiserte sett med symboler, brukes .(prikk) og :(kolon) tegn for å bøye ASCII -symboler, og tolker effektivt unigraphs, digraphs eller sjelden trigraphs som frittstående "symboler".

I motsetning til bruk av digrafer og trigrafer i C og C ++ , er det ingen ekvivalenter med enkelt tegn til disse i J.

C

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

Den C-preprosessor (brukt for C og med små forskjeller i C ++ ; se nedenfor ) erstatter alle forekomster av de ni trigraph sekvensene i denne tabellen av sine enkelttegn-ekvivalenter før noen annen behandling.

En programmerer vil kanskje sette to spørsmålstegn sammen, men ikke la kompilatoren behandle dem som å introdusere en trigraph. C-grammatikken tillater ikke to påfølgende ?tokens, så de eneste stedene i en C-fil hvor to spørsmålstegn på rad kan brukes er i konstanter med flere tegn, strengbokstaver og kommentarer. Dette er spesielt et problem for det klassiske Mac OS , der konstanten '????'kan brukes som en filtype eller skaper. For å trygt plassere to påfølgende spørsmålstegn i en streng, kan programmereren bruke strengkopling "...?""?..."eller en fluktsekvens "...?\?..." .

???er ikke i seg selv en trigrafsekvens, men når den følges av et tegn som -det vil bli tolket som ?+ ??-, som i eksemplet nedenfor som har 16 ?s før /.

Den ??/trigraph kan brukes til å innføre en rømt ny linje for linje skjøting; dette må tas i betraktning for korrekt og effektiv håndtering av trigrafer i forprosessoren. Det kan også forårsake overraskelser, spesielt i kommentarer. For eksempel:

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

som er en enkelt logisk kommentarlinje (brukt i C ++ og C99 ), og

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

som er en korrekt dannet blokkkommentar. Konseptet kan brukes til å sjekke om det er trigrafer som i det følgende C99 -eksemplet, der bare én returoppgave vil bli utført.

int trigraphsavailable() // returns 0 or 1; language standard C99 or later
{
	// are trigraphs available??/
	return 0;
	return 1;
}
Alternative digraphs introdusert i C -standarden i 1994
Digraph Tilsvarende
<: [
:> ]
<% {
%> }
%: #

I 1994 leverte en normativ endring av C -standarden, inkludert i C99, digrafer som mer lesbare alternativer til fem av trigrafene.

I motsetning til trigraphs, håndteres digraphs under tokenisering , og enhver digraph må alltid representere et fullt token alene, eller komponere tokenet som %:%:erstatter preprocessor -sammenkoblingstokenet ##. Hvis det oppstår en digrafsekvens inne i et annet token, for eksempel en sitert streng eller en tegnkonstant, blir den ikke erstattet.

C ++

Token Tilsvarende
compl ~
not !
bitand &
bitor |
and &&
or ||
xor ^
and_eq &=
or_eq |=
xor_eq ^=
not_eq !=

C ++ (gjennom C ++ 14 , se nedenfor ) oppfører seg som C, inkludert C99 -tilleggene, men med flere tokens oppført i tabellen.

Som et notat, %:%:blir det behandlet som et enkelt token, i stedet for to forekomster av %:.

C ++ -standarden gir denne kommentaren med hensyn til begrepet "digraph":

Begrepet "digraph" (token som består av to tegn) er ikke helt beskrivende, siden en av de alternative forbehandlingstokenene er %:%:og selvfølgelig flere primære tokens inneholder to tegn. Ikke desto mindre er de alternative tokensene som ikke er leksikale søkeord, i daglig tale kjent som "digraphs".

Trigrafer ble foreslått for avskrivning i C ++ 0x , som ble utgitt som C ++ 11 . Dette ble motarbeidet av IBM , som talte på vegne av seg selv og andre brukere av C ++, og som et resultat ble trigrafer beholdt i C ++ 11. Trigrafer ble deretter foreslått igjen for fjerning (ikke bare avskrivning) i C ++ 17 . Dette vedtok en komitéavstemning, og trigrafer (men ikke tilleggstegnene) fjernes fra C ++ 17 til tross for motstanden fra IBM. Eksisterende kode som bruker trigrafer kan støttes ved å oversette fra kildefilene (analysere trigrafer) til det grunnleggende kildetegnsettet som ikke inkluderer trigrafer.

RPL

Hewlett-Packard- kalkulatorer som støtter RPL- språket og inndatametoden gir støtte for et stort antall trigrafer (også kalt TIO-koder ) for pålitelig å transkribere ikke-syv-biters ASCII-tegn i kalkulatorens utvidede tegnsett på utenlandske plattformer, og for å lette tastaturet input uten å bruke CHARS -applikasjonen. Det første tegnet i alle TIO -koder er a \, etterfulgt av to andre ASCII -tegn som vagt ligner glyfen som skal erstattes. Alle andre tegn kan skrives inn ved hjelp av den spesielle \nnnTIO-kodesyntaksen med nnn som et tresifret desimaltall (med ledende nuller om nødvendig) for det tilsvarende kodepunktet (derved formelt en tetragraf ).

Applikasjonsstøtte

Vim

Den Vim teksteditor støtter digraphs for selve oppføringen av teksttegn, etter RFC  1345 . Oppføringen av digrafer er som standard bundet til Ctrl+ K. Listen over alle mulige utgravninger i Vim kan vises ved å skrive :dig.

GNU -skjerm

GNU Screen har en digraph -kommando, bundet til Ctrl+ A Ctrl+ Vsom standard.

Lotus

Lotus 1-2-3 for DOS bruker Alt+ F1som komponeringsnøkkel for å gjøre det lettere å legge inn mange spesialtegn i Lotus International Character Set (LICS) og Lotus Multi-Byte Character Set (LMBCS).

Se også

Referanser

Eksterne linker