Od artima.com až k parsovacím stromům

Před nedávnem jsem tu psal o zajímavém interview s Andersem Hejlsbergem, autorem Turbo/Borland/Object Pascalu a nově také jazyka C#. Včera jsem se měl učit na dnešní zkoušku z assembleru, ale jak už to bývá, místo toho jsem se snažil učení-mučení oddálit co nejdál a prolézal jsem internet... a zjistil jsem, že zmíněné interview má nová pokračování. Co víc, na serveru artima.com jsou i další rozhovory se zajímavými lidmi – Jamesem Goslingem, (autor Javy), Bjarne Stroustrupem (autor C++) a dalšími. Jelikož obor, kterému se chci v budoucnu věnovat, jsou počítačové jazyky, a zajímavých článků o nich bylo na serveru opravdu dost, asi chápete, že na assembler jsem se ten večer ani nepodíval...

Část, která mě zaujala asi nejvíc, byl popis projektu Jackpot, na kterém nyní pracuje James Gosling. Jde v něm především o to, aby se dalo pracovat s počítačovým programem zapsaném v nějakém jazyce nikoliv jako s textem, což je dnes obvyklé, ale jako se stromovitou strukturou, která je pro strukturovaný jazyk přirozená. Nad tímto stromem se pak mohou snadno provádět různé operace jako refaktorizace apod.

Teď jste možná trochu zmateni abstraktností minulého odstavce, ale ukážu konkrétní příklad, kde by se to hodilo – vytažený přímo z praxe. Dnes jsem v jednom projektu v PHP potřeboval provést doplnění parametru s hodnotou ENT_QUOTES do všech výskytů funkce htmlspecialchars. Těchto výskytů bylo v celém projektu několik set.

Zdánlivě je to práce pro search & replace přes více souborů (případně s regulárními výrazy), což umí každý slušný editor. Bohužel ale zdání klame. V programu se totiž běžně vyskytují třeba takovéto konstrukce:

htmlspecialchars($interprets[$interpret_index]["name"] . ": " . $item["name"])

Parametrem  funkce může být v principu "skoro cokoliv", přičemž toto "skoro cokoliv" se rozhodně nedá popsat regulárním výrazem (jak by vám dokázal každý, kdo absolvoval na matfyzu přednášku automaty a gramatiky). Takže nakonec jsem musel všechny záměny provést ručně (a popravdě řečeno čekám, kdy zákazník začne hlásit chyby vzniklé tím, že jsem se někde uklepl).

Právě v tomto případě by pomohla reprezentace programu pomocí parsovacího stromu. Volání funkce htmlspecialchars by v ní vypadalo zhruba takto:

Parsovací stom - před úpravou

Pak by stačilo jen nějakým způsobem zadat do editoru následující operaci: Pro každý vrchol stromu typu "funkce" s názvem "htmlspecialchars" přidej jeden poduzel typu "parametr" s konstantní hodnotou "ENT_QUOTES". Výsledek by byl tento strom:

Parsovací strom - po úpravě

Trochu jsem to celé zjednodušil (obvyklý parsovací stom nevypadá jako ten na obrázku, navíc použitý strom by ve skutečnosti musel být o něco složitější než obvyklý parsovací strom, například aby mohl zachovávat formátování zdrojového kódu), ale hlavní myšlenka je snad zřejmá – popisovaná transformace je úplně nezávislá na tom, co je obsahem podstromu "skoro cokoliv". A to je na ní to nejúžasnější.

Vypadá to, že nezbývá, než čekat, zda si některé výsledky projektu Jackpot najdou cestičku do vývojových prostředí...

P.S.: Z té zkoušky z assebleru mám i přes svůj poněkud laxní přístup nakonec jedničku :-)