Transformace syntaktického stromu

Strukturální analýzu zdrojového textu prováděnou parsery můžeme rozdělit na dvě podúlohy: na lexikální analýzu provádějící rozklad na základní symboly, jenž jsou relevantní z hlediska syntaktické analýzy, a analýzu syntaktickou, která se zabývá jeho statickou strukturou. Na strukturální analýzu textu navazuje sémantická analýza, která pomocí přídavných informací kontroluje konzistenci vstupu na vyšší úrovni.

Při kombinátorovém vytváření parserů všechny tyto fáze zpravidla téměř splývají. Podúlohy strukturální analýzy textu zde tvoří nedělitelný celek a omezená sémantická analýza může být prováděna pomocí mutátoru aplikace sémantické operace rovněž již za běhu parseru.

V této kapitole se budeme věnovat prostředkům a způsobům transformace syntaktických stromů vydávaných parsery.

Zastavme se nejprve na chvíli u parserů terminálních symbolů. Všechny dosud zavedené parsery z této kategorie vydávají svůj výsledek v reprezentacích používajících ASCII kódy symbolů. Například symbol vydává ASCII kód akceptovaného znaku a token řetězec -- tedy prologovský seznam ASCII kódů. Pro další zpracování je však v některých situacích výhodnější vydávat výsledky ve formě atomů, například v případě scannerů tj. lexikálních analyzátorů trasformujících vstup na posloupnost tokenů.

Proto knihovna obsahuje varianty všech parserů terminálních symbolů, které vydávají svůj výsledek ve formě atomů. Jsou odlišeny připojením znaku 'A' za název původního parseru, například:

symbolA(S,W):-
 W :-> (fulfil(==(S)) <@ ascii2Atom).

tokenA(String,W):-
 W :-> (token(String) <@ string2Atom).
Při používání těchto parserů v dalším textu se ke způsobu jejich zavedení již nebudeme vracet.

V dalších dvou částech se budeme věnovat mutátoru aplikace sémantické operace a predikátům s ním spojených.



Subsections
dvorka 2013-12-31