Podpora mutátoru $<$$@$

Existuje určitý okruh operací na syntaktických stromech, jež jsou velmi často využívány pro jejich zpracování. Jak bylo zmíněno v definici mutátoru <@, predikáty reprezentující tyto operace mají rozhraní:
$fun(?A_1, \dots, ?A_m, +I, -O)$
kde $A_i$ jsou argumenty specifikované přímo při použití v mutátoru aplikace sémantické operace:
$Parser$ <@ $fun(A_1, \dots, A_m)$
$I$ je argument tvořený výsledkem přicházejícím z parseru a $O$ je výsledek operace $fun$.

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:

$srcFormat$2 $dstFormat(?A_1, \dots, ?A_m, +I, -O)$
S některými z těchto predikátů jsme se již setkali, jako třeba s 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:

$Parser$ <@ $alter(A>B, [A\vert B])$
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é:
$Parser$ <@ $alter(Root>(L>R), treeNode(L,Root,R))$
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:
$ParseExpr$ <@ $eval$
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

$Parser$ <@ $const(Const)$
který ignoruje přicházející výsledek a na výstup vydává hodnotu $Const$ a druhým identita:
$Parser$ <@ $id$
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