<@, predikáty reprezentující tyto operace
mají rozhraní:
kde![]()
![]()
<@![]()
V následujících odstavcích bude uveden přehled nejdůležitějších predikátů používaných v dalších kapitolách, aby byly shromážděny na jednom místě a v průběhu dalšího textu nemuseli být samostatně vysvětlovány. Pro větší stručnost použijeme pseudokód.
První skupina je tvořena predikáty pro konverzi hodnot. Signatura těchto predikátů má obecně tvar:
S některými z těchto predikátů jsme se již setkali, jako třeba s2![]()
tuple2List. Patří sem také ascii2Atom, lower2Upper
či univ2List a mnoho dalších. V případech, které si to vyžadují,
jsou rovněž definovány i jejich symetrické varianty.
Pro jednorázové obecné transformace výsledků tj. situace, kdy
parser vydává jedinou derivaci, je
připraven predikát alter. Zpravidla jej budeme používat pro
ukládání výsledků do struktur. Jeho první parametr se unifikuje s přicházejícím výsledkem parseru a v parametru druhém lze specifikovat
jeho transformovanou verzi. Predikátem alter lze například vyjádřit
i dříve zmíněný tuple2List:
Obvyklejší však bude spíše jeho použití při vytváření stromových datových struktur. Představme si situaci, kdy získáváme z parseru trojice obsahující v první položce kořen nového stromu, v druhé položce levý a v třetí pravý podstrom. Transformace výsledku i vytvoření uzlu je s pomocí predikátu![]()
<@![]()
alter snadné:
V kapitole![]()
<@![]()
vytvoříme parser přijímající jako
vstup aritmetické výrazy, jenž analyzuje jejich strukturu a provede
následně vyhodnocení. Pro řešení jednoduchých úloh tohoto typu potřebujeme
disponovat operací umožňující explicitní vyhodnocení aritmetického
výrazu. Touto operací je eval. Předpokládá vstup ve formě
termu:
Provede vyhodnocení analogické použití standardního prologovského predikátu![]()
<@![]()
is/2.
Především pro ladící účely je připraven predikát show a jeho
varianty showln, showString a další, jež vypisují
výsledek na standardní výstup. Predikáty zobrazují příchozí výsledek,
aniž by jej jakýmkoli způsobem modifikovali.
Zmíníme již pouze poslední dva predikáty. Prvním z nich je
který ignoruje přicházející výsledek a na výstup vydává hodnotu![]()
<@![]()
Použití nacházejí především ve spojení s dalšími operacemi, ale i v jiných konstruktorech parserů -- všude tam, kde daný kombinátor či mutátor vyžaduje predikát pro zpracování hodnoty, ale my ji chceme v daném případě zachovat.![]()
<@![]()
dvorka 2013-12-31