DODATEK A PRZEWODNIK JĘZYKA C____
Wiersz zawierający jedynie znak #
nie ma żadnego skutku.
Istnieje kilka nazw, które są zdefiniowane w preprocesorze i służą do produkowania specjalnych informacji. Definicji tych nazw, jak również operatora defined (występującego w wyrażeniach preprocesora), nie można odwołać ani zmienić.
__LINĘ__Dziesiętna stała całkowita zawierająca numer bieżącego wiersza programu źródłowego.
__FILE__Stała napisowa zawierająca nazwę tłumaczonego pliku.
__DATĘ Stała napisowa zawierająca datę tłumaczenia programu; jej format
- ”Mmm dd rrrr”.
__TIME__Stała napisowa zawierająca czas tłumaczenia programu; jej format
- ”gg:mm:ss”.
__STDC__Stała 1. Z zamierzenia identyfikator ten powinien być zdefiniowany
z wartością 1 jedynie w implementacjach dostosowanych do standardu.
Wiersze sterujące #error i #pragma pojawiły się wraz z ANSI C; nazwy zdefiniowane w preprocesorze są nowe, ale niektóre były już dostępne w kilku implementacjach.
Poniższa gramatyka jest podsumowaniem składni podanej w poprzednich punktach tego dodatku. Zawartość jest dokładnie taka sama, ale zmieniono kolejność reguł składniowych.
W gramatyce występują nie zdefiniowane symbole terminalne: stała-całkowita, stała--znakowa, napis i stała-wyliczenia\ słowa i symbole zapisane pismem specjalnym są podanymi dosłownie symbolami terminalnymi. Gramatykę tę można mechanicznie przekształcić do tekstu akceptowalnego przez automatyczne generatory analizatorów składniowych. Oprócz dodania oznaczenia wymaganego dla alternatyw w produkcjach składniowych, należy również rozwinąć konstrukcję „jeden z” i (jeśli tego wy-
A13 GRAMATYKA
maga generator analizatorów składniowych) powtórzyć te produkcje, które zawierają symbol opc - raz z opcjonalną konstrukcją i raz bez niej. Z jedną dodatkową zmianą, polegającą na usunięciu produkcji nazwa-typedef: identyfikator i zdefiniowaniu symbolu nazwa-typedef jako symbolu terminalnego, gramatyka ta jest akceptowalna przez generator analizatorów składniowych YACC. Gramatyka ta zawiera tylko jeden konflikt, spowodowany niejednoznacznością if-else.
jednostka-tłumaczenia:
deklaracja-zewnętrzna
jednostka-tłumaczenia deklaracja-zewnętrzna
deklaracja-zewnętrzna: definicja-funkcji deklaracja
definicja-funkcji:
specyfikatory-deklaracjiupc deklarator lista-deklaracjinpc instrukcja-złozona deklaracja:
specyfikatory-deklaracji inicjowana-lista-deklaratorówopc ;
lista-deklaracji: deklaracja
lista-deklaracji deklaracja specyfikatory-deklaracji:
specyfikator-klasy-pamięci specyfikatory-deklaracjiopc specyfikator-typu specyfikatory-deklaracji opc kwalifikator-typu specyfikatory-deklaracjiopc
specyfikator-klasy-pamięci: jeden z
auto register static extern typedef
specyfikator-typu: jeden z
void char short int long float double signed unsigned specyfikator-struktury-unii specyfikator-wyliczenia nazwa-typedef
kwalifikator-typu: jeden z const volatile
specyfikator-struktury-unii:
struktura-unia identyfikatoropc { lista-deklaracji-składowych } struktura-unia identyfikator
313