From bbs@floyd.upol.czMon Jan 29 16:15:37 1996 Date: Wed, 6 Dec 1995 15:25:33 +0100 From: BBS Floyd To: hubicka@limax.paru.cas.cz Subject: Skolicka #3-gperf (fwd) *** Forwarded file follows *** Posted By: kotelnik (kotelnik) on 'Linux' Title: Skolicka #3-gperf Date: Mon Dec 4 13:57:52 1995 Pro docela dobry ohlas delam jeste jednu skolicku... Jestli se ale nekdo neprida tak...nechci tu jenom psat chci se taky neco priucit. takze tedy: Kdyz jsem uz nakousnul problem rozdelavani textovych fajlu v cecku chci ho taky dokoncit takze i gperf je program pro generovani programu pro pracu z textem...Manual rika ze je to hash table generator..To znamena ze generuje tabulky pro rozpoznavani stringu-proste kdyz mate retezec vite jeho delku a chcete urcit ktery z 50 klicovych slov to je neni nic lepsiho. Je pomoci neho napsana lexikalni analyza treba kompileru ceka..takze je opravdu dobrej.. Narozdil od flexu nedela nejakou vetsi analyzu-jediny co umi je urcit ktery z 50 slov tento retezec je..Proto je mnohem jednodusi a taky rychlejsi. Neni soucasti standarnti distribuce takze si ho musite stahnout jmenuje se cperf- a je na standartnim gnu site takze i na hodne mirrorech v cecach. Potuluje se i package z jmenem gperf ale to je puvodni verze v c++ takze mene prenositelna a pomalejsi.. Algoritmus kterym postupuje gperfovy rozpoznavac je jednpduchy: koukne se do tabulky na pozici podle prvniho pismena stringu koukne se do tabulky na pozici posledni pismeno koukne se do tabulky na pozici podle delky a vsechno to secte cislo co vyjde je cislo klicoveho slova ve strukture..staci jen porovnat jestli sedi i zbyla pismena. tabulce se rika hash table a je to vlestne nejvetsi problem-to co gperf generuje. Z algoritmu je videt ze to nebude fungovat vzdy:treba kdyz je vas jazyk slozen ze slov: int iit maji v tabulce stejnou pozici a vubec to fungovat nebude...Je tu samozdrejme prepinac ktery algoritmus trochu rozsiri a kdyz jsou tyto kolize vyzkousi proste vsechny mozna slova(tedy int i iit a podle toho vrati spravny vysledek. tato situace nastesti vetsinou nevznikne. nejjednodusi zdrojak pro gperf je prosty seznam slov vygeneruje to potom ceckovsky zdrojak kde je tabulka a funkce in_word_set ktera kdyz se zavola in_word_set(text,delka) vrati 0 kdyz nic nenalezla nebo cislo. gperf ale umi trochu vic:jeho zdrojak se muze skladat z: Deklarace %% Klicova slova %% nejakej ceckovskej kod Deklarace je dobra kdyz k cislo klicovyho slova chcete vedet jeste neco treba prioritu operatoru nebo coslo tokeny prob bisona prvni polozka musi byt char * z textem treba: struct slovo {char *text;int token;}; %% int,258 char,259 float,FLOAT atd...potom se muzete odvolavat na polozky struktury a prace je prijemnejsi gperf ma samozdrejme hafo prepinacu-jestli generovat kod pro c,c++,gnu,ansi c atd nejaky ty typy tabulek a dalsi ptakoviny prectete si manual... Proti fklexovi je to strasne jednoducha vec ale pokud vam jde o rychlost nebo mate nejakej problem co ve flexovi nejde je to super! taky vygenerovanej zdrojak je samostatnej a muze se dodavat rovnou v distribuci nebo pouzivat pod dosem To je asi vsecko Kotelnik ......a ten nejkotlivejsi......