Syntaktiske præprocessorer blev introduceret med Lisp-familien af sprog. Deres rolle er at transformere syntaksetræer i henhold til en række brugerdefinerede regler. For nogle programmeringssprog er reglerne skrevet i det samme sprog som programmet (compile-time reflection). Dette er tilfældet med Lisp og OCaml. Nogle andre sprog er afhængige af et helt eksternt sprog til at definere transformationerne, f.eks. XSLT-præprocessoren til XML eller dens statisk typede modstykke CDuce.

Syntaktiske præprocessorer bruges typisk til at tilpasse syntaksen i et sprog, udvide et sprog ved at tilføje nye primitiver eller indlejre et domænespecifikt programmeringssprog (DSL) i et generelt sprog.

Tilpasning af syntaksEdit

Et godt eksempel på syntakstilpasning er eksistensen af to forskellige syntakser i programmeringssproget Objective Caml. Programmer kan skrives ligegyldigt ved hjælp af den “normale syntaks” eller den “reviderede syntaks”, og de kan efter behov blive pretty-printet med begge syntakser.

På samme måde tilpasser en række programmer skrevet i OCaml sprogets syntaks ved at tilføje nye operatorer.

Udvidelse af et sprogRediger

De bedste eksempler på sprogudvidelse ved hjælp af makroer findes i Lisp-familien af sprog. Mens sprogene i sig selv er simple dynamisk typede funktionelle kerner, tillader standarddistributionerne af Scheme eller Common Lisp imperativ eller objektorienteret programmering samt statisk typning. Næsten alle disse funktioner er implementeret ved syntaktisk forbehandling, selv om det er værd at bemærke, at kompileringsfasen “makroekspansion” i Lisp håndteres af compileren. Dette kan stadig betragtes som en form for forbehandling, da den finder sted før de andre kompileringsfaser.

Specialisering af et sprogRediger

Et af de usædvanlige træk ved Lisp-familien af sprog er muligheden for at bruge makroer til at skabe en intern DSL. Typisk kan et modul i et stort Lisp-baseret projekt være skrevet i en række sådanne minisprog, hvor et af dem måske bruger en SQL-baseret dialekt af Lisp, et andet er skrevet i en dialekt, der er specialiseret til GUI’er eller pretty-printing, osv. Common Lisp’s standardbibliotek indeholder et eksempel på dette niveau af syntaktisk abstraktion i form af LOOP-makroen, som implementerer et Algol-lignende minisprog til at beskrive kompleks iteration, samtidig med at det stadig gør det muligt at anvende standard Lisp-operatorer.

MetaOCaml-præprocessoren/sproget giver lignende funktioner til eksterne DSL’er. Denne præprocessor tager beskrivelsen af et sprogs semantik (dvs. en fortolker) og ved at kombinere kompileringstolkning og kodegenerering forvandler denne definition til en compiler til OCaml-programmeringssproget – og fra dette sprog, enten til bytekode eller til indfødt kode.

admin

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.

lg