@@ -68,17 +68,13 @@ \section{Syntax, syntaxträd och semantik}\label{sec:syntax}
6868För att illustrera begreppet visas här ett domänspecifikt språk som består av en
6969datatyp vars element är
7070syntaxträd som modellerar aritmetiska uttryck, implementerat i Haskell.
71- Datatypen för syntaxträden visas i figur~ \ref { fig:syntax_exempel } .
71+ Datatypen för syntaxträden visas nedan .
7272
73- \begin {figure }[tph]
74- \ begin{lstlisting}
73+ \ begin{lstlisting}
7574data Expr = Expr :+: Expr
76- | Expr :*: Expr
77- | Const Double
78- \end {lstlisting }
79- \caption {En datatyp för aritmetiska uttryck i Haskell. Detta är ett exempel på
80- ett litet domänspecifikt språk.}\label {fig:syntax_exempel }
81- \end {figure }
75+ | Expr :*: Expr
76+ | Const Double
77+ \end {lstlisting }
8278
8379Typen innehåller \textit {datakonstruktorer } för att representera
8480\textit {löv } (ändpunkter) och \textit {förgreningar }. I detta exempel är
@@ -88,20 +84,16 @@ \section{Syntax, syntaxträd och semantik}\label{sec:syntax}
8884\texttt {Const }, vilket är en konstant som ej kan byggas vidare på\todo {Const 10 :*: Const 2??}.
8985
9086Med datakonstruktorerna kan uttryck representerade av syntaxträd konstrueras. Ett exempeluttryck
91- från den tidigare datatypen visas i figur~\ref {fig:syntax_exempel_varde }, där det aritmetiska uttrycket $ 7 * (3
87+ från den tidigare datatypen är
88+ \ begin{lstlisting}
89+ expr = Const 7 :*: (Const 3 :+: Const 10)
90+ \end {lstlisting }
91+ där det aritmetiska uttrycket $ 7 * (3
9292+ 10 )$ modelleras. Konstruktorn \texttt {:*: } får som sina två argument uttrycken
9393\texttt {Const 7 } och \texttt {Const 3 :+: Const 10 }. Det är alltså en produkt av
9494två deluttryck. Syntaxträd brukar illusteras med träddiagram. Detta
9595exempeluttryck illustreras i figur \ref {fig:syntax_exempel_bild }.
9696
97- \begin {figure }[tph]
98- \ begin{lstlisting}
99- expr = Const 7 :*: (Const 3 :+: Const 10)
100- \end {lstlisting }
101- \caption {Ett exempeluttryck ur det tidigare syntaxträdet\todo {Vilket syntaxträd?}. Detta modellerar det
102- matematiska uttrycket $ 7 * (3 + 10 )$ }\label {fig:syntax_exempel_varde }
103- \end {figure }
104-
10597\begin {figure }[tph]
10698 \centering
10799 \includegraphics [width=0.4\linewidth ]{figure/syntax_exempel_bild.png}
@@ -113,26 +105,20 @@ \section{Syntax, syntaxträd och semantik}\label{sec:syntax}
113105i samband med syntaxträd. I detta exempel är semantiken det värde som
114106syntaxträdet har. Detta värde kan beräknas utifrån syntaxträdet genom
115107en \textit {evaluator }, också kallad \textit {beräkningsfunktion }. För \texttt {Expr }
116- kan beräkningsfunktionen se ut som i figur \ref {fig:eval_tree }
117-
118- \begin {figure }[tph]
119- \ begin{lstlisting}
108+ kan beräkningsfunktionen se ut som
109+ \ begin{lstlisting}
120110evaluate :: Expr -> Double
121111evaluate (e1 :+: e2) = evaluate e1 + evaluate e2
122112evaluate (e1 :*: e2) = evaluate e1 * evaluate e2
123113evaluate (Const v) = v
124- \end {lstlisting }
125- \caption {En beräkningsfunktion för syntaxträdet.}\label {fig:eval_tree }
126- \end {figure }
127-
128- Det finns tre speciella saker att observera i
129- figur~\ref {fig:eval_tree }. Den första är att eftersom syntaxen innehåller tre olika
114+ \end {lstlisting }
115+ Det finns tre speciella saker att observera. Den första är att eftersom syntaxen innehåller tre olika
130116slag av element, här motsvarat av de tre datakonstruktorerna, krävs tre fall i
131117funktionen \texttt {evaluate } som beräknar vardera av dem. Den har
132118därför ett fall för \texttt {:+: }, ett för \texttt {:*: } och ett för
133119\texttt {Const }.
134120
135- Den andra saken att notera i figuren är hur ett fall
121+ Den andra saken att notera är hur ett fall
136122beräknas. Hur beräkningen ska se ut fås genom att ta hänsyn till
137123semantiken hos det syntaktiska uttrycket. Här är \texttt {e1 :+: e2 } syntax för
138124addition av de två uttrycken \texttt {e1 } och \texttt {e2 }. Därför blir
0 commit comments