Tu opisane są struktury danych potrzebne językowi CCL (ex-JOSKIPI). Chodzi o struktury, które nie są potrzebne poza językiem (inne struktury — zdanie, anotacja są ogólnego zastosowania).

UWAGA: to już nie jest do końca aktualne; potrzebne struktury danych zostały lepiej zaimplementowane w module WCCL.

SentenceContext

To opakowanie na zdanie, które
  • może żyć krócej niż zdanie, ale nie dłużej; zdania nie można podmienić
  • przechowuje bieżącą pozycję w zdaniu (current_pos), tj. liczbę całkowitą wskazującą na indeks jednego z tokenów w zdaniu (wartość ta może wykraczać poza zakres zdania);
  • is_inside zwraca, czy bieżąca pozycja znajduje się wewnątrz zdania
  • get_current_token zwraca token na bieżącej pozycji lub nic (pusty token, który nie ma leksemów, pusty orth??) gdy not is_inside()
  • bieżącą pozycję da się pobrać i ustawić,
  • jakiś mechanizm ułatwiający iterację bieżącą pozycją po zdaniu, minimum: goto_start i advance
  • opakowanie może zawierać dodatkowe pola przydatne do optymalizacji (np. wyliczone sumy bitowe reprezentacji bitowych wszystkich tagów kolejnych tokenów).

Value

To nadklasa wszystkich typów danych języka
  • to_string(ts: Tagset) zwraca reprezentację tekstową wartości, która jest składniowo poprawna (tj. można przeparsować z powrotem i otrzymamy tę samą wartość)
  • każda podklasa musi operator równości, nierówności i przypisania

Position

To implementacja pozycji. Trzymamy względną wartość lub reprezentację którejś z wartości specjalnych: nowhere, begin, end. Domyślną wartością nowych obiektów jest nowhere.
  • get_abs_value(con, offset = 0) zwraca inta określającego bezwzględny indeks w tablicy tokenów (może być poza zakresem tablicy) lub NIC1, jeśli pozycja ustawiona na nowhere
  • get_abs_value_or_none(con, offset = 0) j.w., ale jeśli indeks wyjdzie poza zakresem tablicy, zwróci NIC
  • get_rel_value(con, offset = 0) zwraca inta określającego pozycję w zdaniu względem bieżącej pozycji (jeśli pozycja jest ustawiona na wartość liczbową, zwrócimy właśnie tę liczbę) lub NIC, jeśli pozycja = nowhere
  • get_rel_value_or_none(con, offset = 0) j.w. ale jeśli pozycja odpowiada indeksowi spoza tablicy, zwracamy NIC
  • dwie pozycje są równe, jeśli ich reprezentacja tekstowa jest taka sama (to określenie

Strset

To implementacja zbioru stringów
  • jakiś mechanizm iteracji, by dało się sprawdzić po kolei wszystkie stringi, np. jako const UnicodeString &
  • add(e: const UnicodeString) dodaje string do zbioru

Tset

To implementacja zbioru symboli.
  • implementacja musi być zoptymalizowana za pomocą masek bitowych
  • by uzyskać reprezentację tekstową, konieczne jest podanie tagsetu (stąd taka sygnatura Value.to_string
  • dodanie podanej maski bitowej (a może obiektu Tag albo Tset)
  • rzutowanie na podaną maskę / Tset
  • count_attrs(tagset) zwraca liczbę różnych atrybutów, których wartości podano w zbiorze (+ 1, jeśli w zbiorze jest jakaś wartość klasy gramatycznej)

Variables

Jest to klasa określająca przypisanie wartości nazwom zmiennych. Ten obiekt jest tworzony przez parser podczas parsowania kilku typów wyrażeń — i przekazywany dalej do funkcji wewnątrz parsera. Dzięki temu, operatory współdzielą zasięg zmiennych. Ewentualnie użytkownik API może utworzyć obiekt sam i korzystać z tych niskopoziomowych funkcji parsera — w celach diagnostycznych.

Język jest silnie typizowany i zmienne różnych typów oznaczone są składniowo. Zawsze wiemy jakiego typu wartość chcemy pobrać. A zatem klasa ta powinna zawierać kilka map, po każdej dla danego typu. Podobnie z interfejsem: mamy funkcje pobierające wartość danego typu, nie chcemy funkcji zwracającej ogólny typ Value.

Szczegóły:
  • getput_pos: zwraca obiekt Position, który przypisany jest do tej nazwy albo jeśli nieprzypisany, tworzymy nowy obiekt Position, wstawiamy go pod tę nazwę i zwracamy.
  • get_pos: zwraca obiekt Position, który przypisany jest do tej nazwy albo jeśli nieprzypisany, to zwraca NIC (np. wskaźnik NULL).
  • set_pos(name: String, val: Position) działa jak getput_pos(name) = val
  • prawdopodobnie obiekty Position trzeba będzie trzymać w boost::shared_ptr

1 Należy przyjąć jakąś reprezentację, która pozwala zwrócić wartość typu int lub NIC (albo jakiś specjalny typ, albo przyjąć np. NIC = INT_MIN). Ważne, by dało się potem sprawdzić czy to int, czy NIC.