Abstracte syntaxis

Uit Wikipedia, de vrije encyclopedie
Ga naar: navigatie, zoeken

Abstracte syntaxis 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 syntaxis genoemd en bij communicatie de transfersyntaxis).

In een compiler wordt een computerprogramma gerepresenteerd met behulp van abstracte termen zoals identifier en variable. Deze representatie is onafhankelijk van de syntaxis van de broncode (de concrete syntaxis) van het programma dat gecompileerd wordt, ook al zullen deze vaak vergelijkbaar zijn. Een syntaxisboom is vergelijkbaar met een abstracte syntaxisboom maar het kan ook zaken als haakjes bevatten die syntactisch gezien wel van belang zijn. Dit soort zaken worden in de abstracte syntaxisboom impliciet gelaten.

Voorbeeld[bewerken]

In functionele programmeertalen kan de abstracte syntaxis vaak rechtstreeks geconstrueerd worden aan de hand van de formele grammatica. Stel we hebben een formele grammatica met de volgende productieregels:

S \rightarrow aS
S \rightarrow bSS
S \rightarrow c

In de programmeertaal Haskell kan dit gerepresenteerd worden met:

data S = CaseA S | CaseB S S | CaseC

De string "abacc" (de concrete syntaxis) kan gerepresenteerd worden met de volgende abstracte syntaxis:

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 syntaxisboom genoemd.

De conversie tussen de abstracte syntaxis en de concrete syntaxis 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 syntaxis naar abstracte syntaxis wordt een parser gebruikt.