Pok-10-wyk-Slajd44
Typy atrybutów
Jak już wspomniano wcześniej domyślnie wszystkie symbole mają atrybuty typu całkowitego (int ). Często jednak zachodzi potrzeba zmiany domyślnego typu atrybutów.
Do tego celu służy słowo kluczowe % union umieszczane w specyfikacji YACCa. Po nim należy wyspecyfikować wszystkie typy jakie będą potrzebne dla wszystkich symboli w całej gramatyce. Na podstawie tej deklaracji YACC generuje definicję unii, która umieszczana jest w pliku y.tab.h (w niektórych implementacjach plik ten – ze względu na ograniczenia systemu plików – może nosić inną, podobną nazwę).
Każdy symbol ma więc atrybut będący na poziomie implementacji unią. Symbol może więc mieć atrybut tylko jednego z zadeklarowanych wcześniej typów.
Jednakowy rozmiar wszystkich atrybutów istotnie upraszcza zarządzanie stosem symboli w analizatorze składniowym (w przeciwnym wypadku musiałaby to być lista), ale co zrobić jeśli dla danego symbolu potrzebnych jest więcej atrybutów?
Najprostszym (ale nieefektywnym rozwiązaniem) jest umieszczenie w unii struktury lub tablicy. Automatycznie powoduje jednak to, że atrybuty wszystkich symboli, niezależnie od tego czy jest to potrzebne, czy nie, będą miały ten sam rozmiar niepotrzebnie zajmując stos atrybutów.
Lepiej jest więc definiując unię nie umieszczać bezpośrednio w niej dużych struktur danych, ale użyć raczej wskaźnika do odpowiednich obiektów alokowanych np. ze sterty.
Wygenerowany przez YACCa plik interfejsu y.tab.h , należy koniecznie włączyć do specyfikacji analizatora leksykalnego. Dzięki temu definicja unii będzie dostępna w akcjach skanera.