You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
För vidare läsning om domänspecifika språk rekommenderas \textit{DSL for the Uninitiated}~\cite{DSLU}.
51
51
52
-
\section{Syntax, syntaxträd och semantik}\label{sec:syntax}
53
-
54
-
I samband med domänspecifika språk dyker begreppen \textit{syntax} och
55
-
\textit{semantik} upp. Syntax är reglerna för hur enheter i språket, till exempel ord och skiljetecken, sammanslås till komplexa strukturer som meningar och
56
-
satser. Semantiken är betydelsen av sådana komplexa strukturer i ett språk.
57
-
Inom aritmetik\footnote{Aritmetik är
58
-
den gren inom matematiken som behandlar räkning av tal.} är tal och
59
-
operationer syntax medan värdet av uttrycket är semantiken. Till
60
-
exempel har det syntaktiska uttrycket $((3 + 2) * 10)^4$ det semantiska värdet $6.250.000$,
61
-
eftersom det är det som det syntaktiska uttrycket \textit{betyder}.
62
-
Domänspecifika språk har med syntax att göra eftersom många
63
-
domänspecifika språk används för att modellera just syntax.
64
-
65
-
I domänspecifika språk som modellerar syntax, så kallade \textit{deep
66
-
embeddings}, kan syntaxen representeras av trädstrukturer. Dessa
67
-
strukturer kallas \textit{syntaxträd}, och har haft stor betydelse i detta projekt.
68
-
För att illustrera begreppet visas här ett domänspecifikt språk som består av en
69
-
datatyp vars element är
70
-
syntaxträd som modellerar aritmetiska uttryck, implementerat i Haskell.
71
-
Datatypen för syntaxträden visas nedan.
52
+
\section{Syntax och semantik}\label{sec:syntax}
72
53
54
+
I samband med domänspecifika språk dyker begreppen \textit{syntax} och \textit{semantik} upp. Syntax är reglerna för hur enheter i språket, till exempel ord och skiljetecken, sammanslås till komplexa strukturer som meningar och satser. Semantiken är betydelsen av sådana komplexa strukturer i ett språk. Inom aritmetik\footnote{Aritmetik är den gren inom matematiken som behandlar räkning av tal.} är tal och operationer syntax medan värdet av uttrycket är semantiken. Till exempel har det syntaktiska uttrycket $7 * (3 + 10)$ det semantiska värdet $91$, eftersom det är det som det syntaktiska uttrycket \textit{betyder}. Domänspecifika språk har med syntax att göra eftersom många domänspecifika språk används för att modellera just syntax.
55
+
56
+
För att illustrera visas här ett domänspecifikt språk i Haskell som modellerar en del av syntaxen för aritmetiska uttryck.
73
57
\begin{lstlisting}
74
58
data Expr = Expr :+: Expr
75
-
| Expr :*: Expr
76
-
| Const Double
59
+
| Expr :*: Expr
60
+
| Const Double
77
61
\end{lstlisting}
62
+
Typen innehåller \textit{datakonstruktorer} för att representera \textit{ändpunkter} och \textit{förgreningar}. I detta exempel är \texttt{:+:} och \texttt{:*:} förgreningar. Med hjälp av dem kan summan respektive produkten av två andra uttryck representeras. Ändpunkterna representeras av \texttt{Const}.
78
63
79
-
Typen innehåller \textit{datakonstruktorer} för att representera
80
-
\textit{löv} (ändpunkter) och \textit{förgreningar}. I detta exempel är
81
-
\texttt{:+:} och \texttt{:*:} förgreningar. Med hjälp av dem kan summan respektive produkten av två andra uttryck uttryckas. Löven
82
-
% Löfven
83
-
representeras av
84
-
\texttt{Const}, vilket är en konstant som ej kan byggas vidare på\todo{Const 10 :*: Const 2??}.
85
-
86
-
Med datakonstruktorerna kan uttryck representerade av syntaxträd konstrueras. Ett exempeluttryck
87
-
från den tidigare datatypen är
64
+
Med hjälp av datakonstruktorerna ovan kan aritmetiska uttryck konstrueras. Till exempel kan $7 * (3 + 10)$ modelleras som
88
65
\begin{lstlisting}
89
66
expr = Const 7 :*: (Const 3 :+: Const 10)
90
67
\end{lstlisting}
91
-
där det aritmetiska uttrycket $7 * (3
92
-
+ 10)$ modelleras. Konstruktorn \texttt{:*:} får som sina två argument uttrycken
93
-
\texttt{Const 7} och \texttt{Const 3 :+: Const 10}. Det är alltså en produkt av
94
-
två deluttryck. Syntaxträd brukar illusteras med träddiagram. Detta
95
-
exempeluttryck illustreras i figur \ref{fig:syntax_exempel_bild}.
68
+
Konstruktorn \texttt{:*:} får som sina två argument uttrycken
69
+
\texttt{Const 7} och \texttt{Const 3 :+: Const 10}. Det är alltså en produkt av två deluttryck.
70
+
71
+
Ett syntaktiskt uttryck kan visualiseras med ett träddiagram, ibland kallat \textit{syntaxträd}. Exempeluttrycket ovan illustreras i figur \ref{fig:syntax_exempel_bild}.
\caption{Ett exempeluttryck från syntaxträdet illustrerat i ett
101
-
träddiagram.}\label{fig:syntax_exempel_bild}
76
+
\caption{Ett exempeluttryck från synatxen \texttt{Expr} visualiserat i ett träddiagram.}\label{fig:syntax_exempel_bild}
102
77
\end{figure}
103
78
104
-
Precis som semantik har en roll i samband med syntax, har semantik även en roll
105
-
i samband med syntaxträd. I detta exempel är semantiken det värde som
106
-
syntaxträdet har. Detta värde kan beräknas utifrån syntaxträdet genom
107
-
en \textit{evaluator}, också kallad \textit{beräkningsfunktion}. För \texttt{Expr}
108
-
kan beräkningsfunktionen se ut som
79
+
För att beräkna semantiken hos ett syntaktiskt uttryck representerat i Haskell används en \textit{beräkningsfunktion}. I fallet med aritmetiska uttryck är semantiken ett numeriskt värde. För \texttt{Expr} kan beräkningsfunktionen se ut som
109
80
\begin{lstlisting}
110
81
evaluate :: Expr -> Double
111
82
evaluate (e1 :+: e2) = evaluate e1 + evaluate e2
112
83
evaluate (e1 :*: e2) = evaluate e1 * evaluate e2
113
84
evaluate (Const v) = v
114
85
\end{lstlisting}
115
-
Det finns tre speciella saker att observera. Den första är att eftersom syntaxen innehåller tre olika
116
-
slag av element, här motsvarat av de tre datakonstruktorerna, krävs tre fall i
117
-
funktionen \texttt{evaluate} som beräknar vardera av dem. Den har
118
-
därför ett fall för \texttt{:+:}, ett för \texttt{:*:} och ett för
86
+
Det finns tre speciella saker att observera. Den första är att eftersom syntaxen innehåller tre olika sorters element, här motsvarat av de tre datakonstruktorerna, används tre fall i funktionen \texttt{evaluate} som beräknar vardera av dem. Den har därför ett fall för \texttt{:+:}, ett för \texttt{:*:} och ett för
119
87
\texttt{Const}.
120
88
121
-
Den andra saken att notera är hur ett fall
122
-
beräknas. Hur beräkningen ska se ut fås genom att ta hänsyn till
123
-
semantiken hos det syntaktiska uttrycket. Här är \texttt{e1 :+: e2} syntax för
124
-
addition av de två uttrycken \texttt{e1} och \texttt{e2}. Därför blir
125
-
semantiken, värdet, av \texttt{e1 :+: e2} lika med värdet hos \texttt{e1} och
126
-
\texttt{e2} adderade. Ett liknande resonemang ger svaret på hur beräkningen av
127
-
de två resterande fallen ska se ut.
128
-
129
-
Den tredje saken värd att poängtera är beräkningsfunktionens
130
-
typsignatur, \texttt{Expr -> Double}. Den gör nämligen att
131
-
\texttt{evaluate}, och beräkningsfunktioner i allmänhet, kan tolkas som en översättning
132
-
från syntax (här \texttt{Expr}) till semantik (här \texttt{Double}).
89
+
Den andra saken att notera är hur ett fall implementeras. Här är \texttt{e1 :+: e2} syntax för addition av de två uttrycken \texttt{e1} och \texttt{e2}. Semantiken av detta är inom aritmetik definerad som summan av värdena hos de två deluttrycken. Implementationen av detta fall ska därför vara \texttt{evaluate e1 + evaluate e2}. Ett liknande resonemang ger svaret på hur beräkningen av de två resterande fallen ska se ut.
90
+
91
+
Den tredje saken värd att poängtera är beräkningsfunktionens typsignatur, \texttt{Expr -> Double}. Den gör nämligen att \texttt{evaluate}, och beräkningsfunktioner i allmänhet, kan tolkas som en översättning från syntax (här \texttt{Expr}) till semantik (här \texttt{Double}).
133
92
134
93
\section{Litterat programmering och Literate Haskell}\label{sec:lhs}
0 commit comments