Skip to content

Commit c3a1921

Browse files
author
Oskar Lundström
committed
Fixade syntax-kapitlet
1 parent a5f3b3a commit c3a1921

File tree

1 file changed

+18
-59
lines changed

1 file changed

+18
-59
lines changed

Rapport/include/Teori.tex

Lines changed: 18 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -49,87 +49,46 @@ \section{Domänspecifika språk}
4949

5050
För vidare läsning om domänspecifika språk rekommenderas \textit{DSL for the Uninitiated}~\cite{DSLU}.
5151

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}
7253

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.
7357
\begin{lstlisting}
7458
data Expr = Expr :+: Expr
75-
| Expr :*: Expr
76-
| Const Double
59+
| Expr :*: Expr
60+
| Const Double
7761
\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}.
7863

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
8865
\begin{lstlisting}
8966
expr = Const 7 :*: (Const 3 :+: Const 10)
9067
\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}.
9672

9773
\begin{figure}[tph]
9874
\centering
9975
\includegraphics[width=0.4\linewidth]{figure/syntax_exempel_bild.png}
100-
\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}
10277
\end{figure}
10378

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
10980
\begin{lstlisting}
11081
evaluate :: Expr -> Double
11182
evaluate (e1 :+: e2) = evaluate e1 + evaluate e2
11283
evaluate (e1 :*: e2) = evaluate e1 * evaluate e2
11384
evaluate (Const v) = v
11485
\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
11987
\texttt{Const}.
12088

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}).
13392

13493
\section{Litterat programmering och Literate Haskell}\label{sec:lhs}
13594

0 commit comments

Comments
 (0)