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 zdaniaget_current_token
zwraca token na bieżącej pozycji lub nic (pusty token, który nie ma leksemów, pusty orth??) gdynot is_inside()
- bieżącą pozycję da się pobrać i ustawić,
- jakiś mechanizm ułatwiający iterację bieżącą pozycją po zdaniu, minimum:
goto_start
iadvance
- 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 nanowhere
get_abs_value_or_none(con, offset = 0)
j.w., ale jeśli indeks wyjdzie poza zakresem tablicy, zwróci NICget_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
alboTset
) - 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
.
getput_pos
: zwraca obiektPosition
, który przypisany jest do tej nazwy albo jeśli nieprzypisany, tworzymy nowy obiektPosition
, wstawiamy go pod tę nazwę i zwracamy.get_pos
: zwraca obiektPosition
, 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 jakgetput_pos(name) = val
- prawdopodobnie obiekty
Position
trzeba będzie trzymać wboost::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.