Metoda: |
Pří výpočtu množiny DFOLLOW je také, vzhledem k jejímu vztahu k množinám FIRST, důležitá volba asociativity kombinátoru sekvenční kompozice. V knihovně konstruktorů parserů je definován tento kombinátor jako operátor s pravou asociativitou (viz příloha ). Tuto volbu jsme učinili ze zřejmého důvodu -- většina rekurzivních datových struktur v jazyce Prolog, jako například pole, je definována s pravou asociativitou, čehož nezřídka využívají knihovní konstruktory.
Nevýhodou zvolené pravé asociativity je, že pokud několik bezprostředně po sobě následujících parserů v pravém podstromu přijímá prázdný řetězec, je nutné podstatně hlubší zanoření do derivačního stromu, aby bylo možné potřebnou množinu FIRST získat. V případě, že tato situace nastává často, může docházet ke znatelné ztrátě efektivity.
V knihovně jsou proto připraveny dva módy. V prvním (eFirst/0
) se provádí
výpočet množin FIRST opakovaně pro každou DFOLLOW.
Zde se naplno projevuje vliv struktury parseru na jeho
abstraktní interpretaci. V druhém módu (eFirst/1
) se jednou získané
výsledky
ukládají, což nám umožňuje globální charakter množin FIRST. Vyhneme
se tak opakovanému prohledávání pravého podstromu
v módu first/0
. Při prvním průchodu se vše vypočte a v
následujích krocích jsou již získávány množinu FIRST jednotlivých
parserů z uložených (parciálních) výsledků. Výpočet tak
pro daný parser proběhne nejvýše jednou.
Zmiňme ještě druhou možnost -- situaci, kdy by byla zvolena levá asociativita kombinátoru sekvenční kompozice (viz také obrázek ).
V tomto případě struktura parseru v podstatě odpovídá struktuře výpočetního stromu, což je výhodné především pro abstraktní interpretaci parseru.
Pro výpočet DFOLLOW se používá identický algoritmus jako u pravé asociativity. Zde však nedochází v případě -přechodu v parseru stojícím v sekvenční kompozici vpravo při jeho abstraktní interpretaci k tak zevrubné analýze a už vůbec ne k opakovanému provádění některých jejích částí. Výsledek té její části, který se u pravé asociativity opakuje je zde získáván v průběhu rozkladu od předků -- výpočet množiny DFOLLOW zde má inkrementální charakter.
Takto efektivního výpočtu lze dosáhnout s levě asociativním kombinátorem sekvenční kompozice pouze v případě módů ukládajících mezivýsledky pro pozdější použití.
Early výpočet DFOLLOW
Množiny DFOLLOW jsou, stejně jako u FIRST, z důvodu prostorové složitosti
reprezentovány seznamem podmínek. Operace nad DFOLLOW jsou prováděny
tak, jak bylo popsáno výše.
Lazy výpočet DFOLLOW
Rozklad vstupního textu s použitím množiny DFOLLOW lze v některých
případech zefektivnit tak, že se proces jejího výpočtu
neprovádí průběžně, ale pouze se přenášejí informace k němu potřebné,
aby pak mohl být ve chvíli, kdy bude DFOLLOW potřeba,
proveden.
Pro přenos potřebných dat se používá zásobník parserů. Místo výpočtu množiny FIRST parseru stojícího v sekvenční kompozici vpravo se tento uloží na zásobník. Tak výpočet pokračuje až do chvíle, kdy se má použít -přechod.
Potom se množina DFOLLOW získá dle následujícího algoritmu:
dvorka 2013-12-31