Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
user:zeman:ukoly:hranice-slov-a-vet [2007/10/17 09:14] zeman Typo. |
user:zeman:ukoly:hranice-slov-a-vet [2007/10/17 09:50] zeman Tokenizátor. |
||
---|---|---|---|
Line 12: | Line 12: | ||
Programy pište v Perlu a snažte se vyvarovat obratů, které by omezily přenositelnost mezi platformami (např. nevolejte externí programy, které se vyskytují pouze v Unixu, resp. pouze ve Windows). | Programy pište v Perlu a snažte se vyvarovat obratů, které by omezily přenositelnost mezi platformami (např. nevolejte externí programy, které se vyskytují pouze v Unixu, resp. pouze ve Windows). | ||
+ | |||
+ | ===== Tokenizátor ===== | ||
+ | |||
+ | //Token// je společný termín, který se někdy používá pro slova a další prvky věty (čísla, interpunkci). Pokud nebude řečeno na konkrétním místě něco jiného, my budeme používat výrazy //token// a //slovo// jako zaměnitelné. Tokenizátor je program, který má rozdělit vstupní text na tokeny. | ||
+ | |||
+ | Váš program se má jmenovat '' | ||
+ | |||
+ | Vstupní i výstupní text je v UTF-8 v libovolném jazyku. Na vstupu mohou být vyznačené hranice odstavců pomocí zalomení řádku (znak LF nebo dvojice CR LF). Tokenizátor nesmí ztratit informaci o tom, zda mezi dvěma slovy byl konec odstavce (řádku), má však mazat nadbytečné prázdné odstavce, ve kterých není žádné slovo. Na začátku a na konci řádku nemají zůstat žádné mezery, mezi dvěma tokeny má být právě jedna mezera (bez ohledu na to, kolik jich bylo na vstupu). Nejdůležitějším úkolem programu je přidat mezeru mezi tokeny, které na vstupu nebyly oddělené. Pravidla, podle čeho poznat hranici tokenu, následují. | ||
+ | |||
+ | **Upozornění: | ||
+ | |||
+ | - Nepřerušený řetězec písmen a/nebo číslic je jedno slovo nebo jeho část. Pozor, tato část by měla být jazykově nezávislá a v některých jazycích jsou písmena, se kterými se v češtině nesetkáte. Obdobně číslice jsou i jiné, třeba arabské. Tip: Nemusíte kvůli jazykové nezávislosti procházet celý Unicode a vypisovat do zdrojáku, co je písmeno a co ne. To už někdo udělal za vás. Podívejte se do dokumentace Perlu na části perlre (regulární výrazy) a perlunicode. Např. '' | ||
+ | - Mezerové znaky (řídící znaky včetně TAB, CR a LF, mezera 32, asi i NBSP 160, případné mezery ve vyšších patrech Unicodu) netvoří slovo ani jeho část. Považují se za oddělovače (ale viz výjimky níže). Na výstupu tokenizátoru může být buď jedna prostá mezera, nebo konec řádku. | ||
+ | - Zvláštní znaky (cokoliv, co není písmeno, číslice ani mezera) zpravidla netvoří jedno slovo s písmeny a číslicemi, | ||
+ | - Zvláštní znaky obklopené z obou stran číslicemi jsou spolu s číslicemi na obou stranách součástí jednoho slova. To se týká zejména desetinné čárky nebo tečky, ale i oddělovače řádů (tečka, čárka, apostrof). Oddělovačem řádů může být i mezera. Proto mezera mezi dvěma čistě číselnými řetězci by se měla (spolu s oběma číselnými řetězci) považovat za součást jediného slova. (Takové mezery nejsou oddělovači, | ||
+ | - Výjimkou z předcházejícího pravidla (tedy vlastně výjimkou z výjimky) jsou data. Pokud se pozná, že jde o datum, mělo by být rozděleno tak, aby den, měsíc a rok byly samostatnými slovy a případná interpunkce také. (Důvod: bude-li jinde uvedeno stejné datum, ale s měsícem vyjádřeným slovně ("1. července 2005" | ||
+ | - Sousedící, | ||
+ | - Znak dolaru může přiléhat zprava k posloupnosti písmen, v tom případě s nimi tvoří jedno slovo (např. US$, A$, C$, HK$). | ||
+ | - E-mailové adresy a URL jsou výjimky a tvoří vždy jedno slovo. (Pozor, pokud se vyskytnou na vhodném místě věty, může k nim být zprava přilepená interpunkce, | ||