Abstracte syntax
Uit Wikipedia, de vrije encyclopedie
Abstracte syntax is een representatie van data (vaak een bericht dat over een communicatiekanaal wordt verstuurd of een computerprogramma dat gecompileerd wordt) die onafhankelijk is van machine-afhankelijke datastructuren en coderingen en ook van de werkelijke representatie van de data (in het geval van compileren de concrete syntax genoemd en bij communicatie de transfer syntax).
In een compiler wordt een computerprogramma gerepresenteerd met behulp van abstracte termen zoals identifier en variable. Deze representatie is onafhankelijk van de syntax van de broncode (de concrete syntax) van het programma dat gecompileerd wordt, ook al zullen deze vaak vergelijkbaar zijn. Een syntaxisboom is vergelijkbaar met een abstracte syntax-boom maar het kan ook zaken als haakjes bevatten die syntactisch gezien wel van belang zijn. Dit soort zaken worden in de abstracte syntax-boom impliciet gelaten.
[bewerk] Voorbeeld
In functionele programmeertalen kan de abstracte syntax vaak rechtstreeks geconstrueerd worden aan de hand van de formele grammatica. Stel we hebben een formele grammatica met de volgende productieregels:
In de programmeertaal Haskell kan dit gerepresenteerd worden met:
data S = CaseA S | CaseB S S | CaseC
De string "abacc" (de concrete syntax) kan gerepresenteerd worden met de volgende abstracte syntax:
CaseA (CaseB (CaseA CaseC) CaseC)
Deze representatie kan ook gezien worden als een boomstructuur waarbij CaseA de wortel is met CaseB als kind (en idem voor de andere componenten). Dit wordt de abstracte syntax-boom genoemd.
De conversie tussen de abstracte syntax en de concrete syntax is vrij eenvoudig:
toConcrete :: S -> String toConcrete (CaseA x) = "a" ++ toConcrete x toConcrete (CaseB x y) = "b" ++ toConcrete x ++ toConcrete y toConcrete CaseC = "c"
Voor het omzetten van de concrete syntax naar abstracte syntax wordt een parser gebruikt.




