empty/0
.
V módu empty/0
je provedena abstraktní interpretace za účelem
analýzy parseru. Pokud je schopen přijmout prázdný řetězec, vydá
atom true
, v opačném případě vydá false
.
Nejdříve si ukážeme některá ze základních primitiv:
epsilon(empty+true). return(_,empty+true). terminate(empty+false). item(empty+false). fulfil(_,empty+false). symbol(_,empty+false).Rozšíření definic konstruktorů je velmi přirozené. Sekvenční kompozice parserů a přijímá prázdný řetězec právě tehdy, když jej přijímá jak tak :
<&>(P1,P2,empty+Empty):- empty+Empty1 :-> P1, empty+Empty2 :-> P2, pcAND(Empty1,Empty2,Empty).Alternativní kompozice parserů a přijímá prázdný řetězec právě tehdy, když jej přijímá buď parser nebo :
<:>(P1,P2,empty+Empty):- empty+Empty1 :-> P1, empty+Empty2 :-> P2, pcOR(Empty1,Empty2,Empty).Doplnění klauzulí módu je nutné pouze u základních kombinátorů a mutátorů. Složitější parsery nemusejí být doplňovány ani modifikovány, protože jsou z nich složeny. Můžeme si proto hned ukázat parser
double
v módu empty/0
.
Bez zásahů do zdrojového kódu nám vydá požadovaný výsledek:?- empty+Empty :-> double. Empty = false YesVýpočet v
empty/0
se od doposud představených módů liší tím, že
má charakter abstraktní interpretace parseru. Při výpočtu se
neprovádí rozklad, ale získávají se informace o jeho vlastnostech.
Stejný charakter bude mít i mód, který vytvoříme v následující části.
dvorka 2013-12-31