Előfeldolgozás

A fordítóprogram minden forrásfájl feldolgozását szakaszokban végzi el. Az előfeldolgozás képezi az első szakaszt, amely a fordítási egységet állítja elő. Az előfeldolgozó úgy tekinti a forrásfájlt, mint sorokból álló szöveges fájlt. Megadhatunk direktívákat és makrókat, melyek beszúrnak, törölnek vagy módosítanak sorokat a szöveges fájlban.

A következőkben az előfeldolgozás során végzett műveleteket ismertetjük.

 

A fordítás szakaszai

 

A fordító sorrendben a következő lépéseket hajtja végre:

 

  1. Minden sor végét a NL karakterrel zárja le, függetlenül a megvalósítás sor-vége jelétől.
  2. Konvertálja a trigraph karaktereket az egykarakteres megfelelőjükké.
  3. Egyesít minden backslash (\) végű sort a következővel.
  4. Minden megjegyzést (a /* és */ karaktersorozat közötti tetszőleges karaktersorozat, kivéve ha nem karakter konstans vagy string konstans belsejében van) helyettesít egyetlen space karakterrel.
  5. Az így keletkezett logikai sorokat preprocessing tokenekre és üres (white space) karakterekre bontja.
  6. Felismeri és alkalmazza a direktívákat és a makrókat (amelyek nem lettek kihagyva).
  7. Helyettesíti az escape szekvenciákat az egykarakteres megfelelőjükkel.
  8. Egyesíti az egymás melletti string konstansokat.
  9. A megmaradt preprocessing tokeneket C tokenekkel helyettesíti és elhagyja a szükségtelen üres karaktereket a fordítási egység formátumának megfelelően.
  10. A fordítási egységet egy vagy több deklarációként elemzi és lefordítja a C tokeneknek megfelelően.

 

Preprocessing tokenek

 

A prepocessing token a leghosszabb karaktersorozat (mohó algoritmus), mely illeszkedik a következő minták valamelyikére:

 

 

Szám (egész és lebegőpontos):

 

Néhány helyes szintaxisú szám (csak az előfeldolgozás során):

0            .123           3E
123          123E0F         3e+xy
123LU        0.123E-005     2for1
314          3.14           .314E+1
0xa5         .14E+          1z2z

 

Az összes operátor vagy más speciális karakter:

 

...   &&   -=   >=   ~   +   ;   ]
<<=   &=   ->   >>   %   ,   <   ^
>>=   *=   /=   ^=   &   -   =   {
!=    ++   <<   |=   (   .   >   |
%=    +=   <=   ||   )   /   ?   }
##    --   ==   !    *   :   [   #

 

White Space karakterek

White space karaktert többféle okból használunk, úgymint,

A white space karakter háromféle lehet:

 

Trigraph karakterek

Egy trigraph karaktersorozat 3 karakterből áll, melyből az első kettő mindig kérdőjel (??) karakter. Akkor használjuk ha a megvalósításunkban nem léteznek a bonyolultabb karakterek. Az összes definiált trigraph karakter:

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

Csak és csakis ezek a trigraph karakterek. A fordító minden más esetben nem helyettesíti a dupla kérdőjelet. Vannak fordítók, ahol a trigraph karakterek helyettesítése nem történik meg, vagy opcióval állítható, hogy megtörténjen-e. A szabványos C nyelvben mindig van trigrpah helyettesítés!

Példa:

    printf("Case ??=3 is done??/n");
    printf("You said what????/n");

helyettesítődik:

    printf("Case #3 is done\n");
    printf("You said what??\n");

 

Include direktívák

 

Az include direktíva segítségével beszúrhatunk egy szöveges fájlt a fordítandó forrásprogramba. A szabványos könyvtári függvényekre való hivatkozásokat is így szúrjuk be (<> jelek között). A beszúrandó fájl neve lehet egy már korábban kifejtett define direktíva eredménye is.

 

 

Define direktívák

 

 

 

Feltételes direktívák

 

Egyéb direktívák

 

Előre definiált makrók

 

__DATE__        "Mmm dd yyyy"

__FILE__        string

__LINE__        decimális int

__STDC__        decimális 1, ha szbványos C fordító