Odrzuty ze specyfikacji¶
Zgromadzono tu rzeczy, które były planowane, ale nie zostały zrealizowane. Dotyczy to przede wszystkim braku implementacji, choć specyfikacja tych konstrukcji może też wymagać przemyślenia.
Predykaty sprawdzające anotacje (L1)¶
Uwaga: wyrażenia te są już w gramatyce libwccl, nie ma natomiast implementacji.
Operatory sprawdzające anotacje (na poziomie tokenów, nie dopasowań). Odtąd phrase_name
to nazwa frazy (typu pojedynczy string).
phrase(pos, phrase_name)
wtt. gdy przez podaną pozycję przechodzi anotacja o podanej nazwie (anotacja może się zamykać w podanej pozycji, może być większa)phrase_beg(pos, phrase_name)
wtt. gdy przez podaną pozycję przechodzi anotacja o podanej nazwie i jest to jej pierwszy tokenphrase_end(pos, phrase_name)
wtt. gdy przez podaną pozycję przechodzi anotacja o podanej nazwie i jest to jej ostatni tokenphrase_whole(pos1, pos2, phrase_name)
wtt. gdy ciągła anotacja zaczyna się na pos1
i kończy się na pos2
(ciągła anotacja może być fragmentem większej, nieciągłej; my sprawdzamy tylko ciągły kawałek)phrase_pp(pos1, pos2, phrase_name)
wtt. gdy obie pozycje należą do tej frazy tego samego typu i jest to albo ta sama ciągła fraza, albo dwa kawałki większej nieciągłej frazy (tj. należą do ciągłych anotacji o tych samych indeksach)
Iteracja za pomocą fraz (L1)¶
Uwaga: wyrażenia te są już w gramatyce libwccl, nie ma natomiast implementacji.
lphrase(pos1, posvar, phrase_name)
wtt. gdy phrase(pos1, phrase_name)
Skutki uboczne:
- w razie sukcesu,
posvar
jest ustawiana na pierwszy token frazy przechodzącej przezpos1
- w razie porażki (tj. gdy przez
pos1
nie przechodzi fraza o podanej nazwie),posvar
ustawiana jest nanowhere
- iterujemy tylko w ramach ciągłego kawałka frazy
Disaster: ops.p_phraseleft
rphrase(pos1, posvar, phrase_name)
wtt. gdy phrase(pos1, phrase_name)
Skutki uboczne:
- w razie sukcesu,
posvar
jest ustawiana na ostatni token frazy przechodzącej przezpos1
- w razie porażki,
posvar
ustawiana jest nanowhere
- iterujemy tylko w ramach ciągłego kawałka frazy
Disaster: ops.p_phraseright
lphrasewhole
, rphrasewhole
-- j.w., lecz frazy nieciągłe są obsługiowane, tj. ustawiamy się na skrajnym tokenie biorąc pod uwagę wszystkie kawałki frazy
phrasehead(pos1, posvar, phrase_name)
wtt. gdy phrase(pos1, phrase_name)
Skutki uboczne:
- w razie sukcesu,
posvar
jest ustawiana na pozycję będącą nadrzędnikiem frazy - w razie porażki,
posvar
ustawiana jest nanowhere
- nadrzędnik może znajdować się w innym kawałku niż ten, na którym stoi
pos1
, i tak go znajdziemy
anyregex¶
W języku istnieje operator regex
, który wymaga, by wszystkie napisy spełniały wyrażenie. Propozycja rozszerzenia to operator anyregex
, który wymaga, by istniał napis spełniający.
apply_ahead (L2)¶
Uwaga: apply ahead jest mniej istotny niż apply.
apply_ahead(MATCH, MATCH_AHEAD, ACTIONS)
TODO uaktualnić składnięapply_ahead(MATCH, MATCH_AHEAD, CONDITION, ACTIONS)
- Iteracja zewnętrzna (bieżącą pozycją w zdaniu) działa jak w zwykłym
apply
- Gdy uda się dopasować,
- zapamiętujemy bieżącą pozycję w zdaniu,
- odpalamy tymczasowo drugą iterację, sprawdzając drugie dopasowanie (
MATCH_AHEAD
), - tutaj idziemy tylko do pierwszego dopasowania (lub porażki); jeśli się uda dopasować, wstawiamy (
ARRAY(m1, m2)
w zmienną$m:_M
, gdziem1
im2
to wyniki matchów; sprawdzamy warunki i odpalamy akcje
- Jeśli udało się dopasować
MATCH
(naMATCH_AHEAD
nie nakładamy żadnych warunków), to pomijamy długość MATCH - Jeśli nie, pomijamy jeden token
- Operator zwraca wektor odpowiadający części
MATCH
jako $m:_M, natomiast odpowiadający częściMATCH_AHEAD
jako $m:_MA.
Składnia skrócona: zapis MA
odnoszący się do $m:_MA.
Relacje (L2)¶
TODO: określić, co dzieje się z relacjami, głowami i opisem anotacji, gdy coś zmieniamy (mark, unmark).
TODO: akcje znakujące relacje w match i tag rules