A szintaktikai preprocesszorokat a Lisp nyelvcsaláddal vezették be. Szerepük a szintaxisfák átalakítása a felhasználó által meghatározott szabályok szerint. Egyes programozási nyelvek esetében a szabályok ugyanazon a nyelven íródnak, mint a program (fordítási idejű tükrözés). Ez a helyzet a Lisp és az OCaml esetében. Néhány más nyelv teljesen külső nyelvre támaszkodik a transzformációk definiálásához, mint például az XSLT preprocesszor az XML-hez, vagy annak statikusan tipizált megfelelője, a CDuce.
A szintaktikai preprocesszorokat általában egy nyelv szintaxisának testreszabására, egy nyelv új primitívekkel való bővítésére, vagy egy általános célú nyelvbe egy szakterület-specifikus programozási nyelv (DSL) beágyazására használják.
Szintaxis testreszabásaEdit
A szintaxis testreszabására jó példa az Objective Caml programozási nyelv két különböző szintaxisának létezése. A programokat közömbösen meg lehet írni a “normál szintaxissal” vagy az “átdolgozott szintaxissal”, és igény szerint bármelyik szintaxissal szépen ki lehet írni.
Hasonlóképpen, számos OCaml-ban írt program új operátorok hozzáadásával testre szabja a nyelv szintaxisát.
Egy nyelv bővítéseEdit
A nyelv makrókkal történő bővítésére a legjobb példákat a Lisp nyelvcsaládban találjuk. Míg a nyelvek önmagukban egyszerű dinamikusan tipizált funkcionális magok, a Scheme vagy a Common Lisp szabványos disztribúciói lehetővé teszik az imperatív vagy objektumorientált programozást, valamint a statikus tipizálást. Szinte mindezeket a funkciókat szintaktikai előfeldolgozással valósítják meg, bár meg kell jegyezni, hogy a fordítás “makróbővítési” fázisát a Lispben a fordító kezeli. Ez még mindig az előfeldolgozás egy formájának tekinthető, mivel a fordítás többi fázisa előtt történik.
Egy nyelv specializálásaSzerkesztés
A Lisp nyelvcsalád egyik szokatlan jellemzője, hogy a makrók segítségével belső DSL-t hozhatunk létre. Jellemzően egy nagy Lisp-alapú projektben egy modul többféle ilyen mininyelven íródhat, az egyik talán a Lisp egy SQL-alapú dialektusát használja, a másik egy GUI-ra vagy pretty-printingre specializált dialektusban íródott, stb. A Common Lisp szabványkönyvtára tartalmaz egy példát a szintaktikai absztrakció ezen szintjére a LOOP makró formájában, amely egy Algol-szerű mininyelvet valósít meg az összetett iteráció leírására, miközben lehetővé teszi a szabványos Lisp operátorok használatát.
A MetaOCaml előfeldolgozó/nyelv hasonló funkciókat biztosít a külső DSL-ek számára. Ez az előfeldolgozó egy nyelv szemantikájának leírását veszi (azaz egy értelmezőt), és a fordítási idejű értelmezés és kódgenerálás kombinálásával ezt a definíciót az OCaml programozási nyelvre – és ebből a nyelvből akár bytecode-ra, akár natív kódra – fordítóprogrammá alakítja.