summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--defstate.tex6
-rw-r--r--preamble.tex3
-rw-r--r--rules.tex2
-rw-r--r--rulesexec.tex60
-rw-r--r--smurf.sty4
5 files changed, 49 insertions, 26 deletions
diff --git a/defstate.tex b/defstate.tex
index 4dee41e..135aeea 100644
--- a/defstate.tex
+++ b/defstate.tex
@@ -16,6 +16,12 @@ $\lambda$ in overeenstemming met de documentatie \cite{safalra}:
variable values are initially set to the empty string.
\end{quote}
+Een toewijzing van $\val$ aan $\var$ noteren we als $\var\mapsto\val$, zodat we
+bijvoorbeeld $\{\texttt{x}\mapsto\texttt{hello world}\}$ noteren voor de store
+die \texttt{x} naar ``hello world'' stuurt. We laten de strings die naar
+$\lambda$ sturen normaal gesproken weg. De initiële store schrijven we dus als
+$\emptystore$.
+
Om de waarde van een key $k$ uit store $\str$ te halen gebruiken we simpelweg
$\str~k$. Vervolgens definiëren we $\putop:\SynString \times \SynString \times
(\String\to\String) \to (\String\to\String)$ die gegeven een variabelenaam, een
diff --git a/preamble.tex b/preamble.tex
index ce5a946..3f6c165 100644
--- a/preamble.tex
+++ b/preamble.tex
@@ -19,3 +19,6 @@
% Eigen packages
\usepackage{smurf}
+% Fix voor babel dutch
+\everymath{\shorthandoff{"}}
+
diff --git a/rules.tex b/rules.tex
index e77286d..b3976c5 100644
--- a/rules.tex
+++ b/rules.tex
@@ -21,5 +21,5 @@ Smurfprogramma's makkelijker zal maken.
\input{rulesput}
%\input{rulesinput}
%\input{rulesoutput}
-%\input{rulesexec}
+\input{rulesexec}
diff --git a/rulesexec.tex b/rulesexec.tex
index 47b77f3..6c3473d 100644
--- a/rulesexec.tex
+++ b/rulesexec.tex
@@ -2,15 +2,20 @@
\subsection{\texttt{Exec}}
\begin{quote}
- x - Executes the string at the top of the stack as a Smurf program. The stack and variable store are erased.
+ x - Executes the string at the top of the stack as a Smurf program. The stack
+ and variable store are erased.
\end{quote}
-We halen een string van de stack en gebruiken $\parsepgmop$ om dit in een programma om te zetten. Dit wordt het nieuwe programma om uitgevoerd te worden. Als de $\stk$ leeg is is deze regel niet toepasbaar, omdat $\pop\stk$ dan niet gedefinieerd is. Ook is deze regel niet toepasbaar als de gepopte string zelf geen geldig Smurf-programma is, omdat $\parsepgmop$ dan niet gedefinieerd is.
+We halen een string van de stack en gebruiken $\parsepgmop$ om dit in een
+programma om te zetten. Dit wordt het nieuwe programma om uitgevoerd te worden.
+Als de $\stk$ leeg is is deze regel niet toepasbaar, omdat $\pop\stk$ dan niet
+gedefinieerd is. Ook is deze regel niet toepasbaar als de gepopte string zelf
+geen geldig Smurf-programma is, omdat $\parsepgmop$ dan niet gedefinieerd is.
$$
\begin{prooftree}
\trans
- {\pgm'}{\ip}{(\Nil, \str')}
+ {\pgm'}{\ip}{(\Nil, \emptystore)}
{\ip'}{\op}{\st}
\justifies
\trans
@@ -20,40 +25,47 @@ $$
\qquad
\text{met\enspace
\parbox{36mm}{$(\var,\stk') = \pop{\stk}$,\\
- $\pgm' = \parsepgm{\var'}$\\
- $\str'~k = \lambda\forall k \in\String$.%tab tussen lambda en forall misschien mooier
- }
+ $\pgm' = \parsepgm{\var'}$.}
}
\end{prooftree}
$$
-$\parsepgmop$ definiëren we als volgt, met hulpfunctie $\parsestrop$:
+\medskip
+$\parsepgmop$ definiëren we als volgt, met een hulpfunctie $\parsestrop$:
$$
\parsepgm s =
\begin{cases}
- \lambda & \text{als $s=\lambda$}\\
- \parsepgm{s'} & \text{als $s=cs'$ met $c=$` `}\\
- \parsestr{s'} & \text{als $s=cs'$ met $c=$`''`}\\
- \StmCat:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`+`}\\
- \StmHead:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`h`}\\
- \StmTail:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`t`}\\
- \StmQuotify:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`q`}\\
- \StmPut:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`p`}\\
- \StmGet:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`g`}\\
- \StmInput:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`i`}\\
- \StmOutput:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`o`}\\
- \StmExec:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`x`}\\
+ \lambda & \text{als $s=\lambda$}\\
+ \parsepgm{s'} & \text{als $s=c~s'$ met $c$ whitespace}\\
+ \parsestr{s'} & \text{als $s=\texttt{"}~s'$} \\
+ \StmCat:\parsepgm{s'} & \text{als $s=\texttt{+}~s'$} \\
+ \StmHead:\parsepgm{s'} & \text{als $s=\texttt{h}~s'$} \\
+ \StmTail:\parsepgm{s'} & \text{als $s=\texttt{t}~s'$} \\
+ \StmQuotify:\parsepgm{s'} & \text{als $s=\texttt{q}~s'$} \\
+ \StmPut:\parsepgm{s'} & \text{als $s=\texttt{p}~s'$} \\
+ \StmGet:\parsepgm{s'} & \text{als $s=\texttt{g}~s'$} \\
+ \StmInput:\parsepgm{s'} & \text{als $s=\texttt{i}~s'$} \\
+ \StmOutput:\parsepgm{s'} & \text{als $s=\texttt{o}~s'$} \\
+ \StmExec:\parsepgm{s'} & \text{als $s=\texttt{x}~s'$} \\
\end{cases}
$$
-Het tweede geval van $\parsepgmop$ zorgt ervoor dat een programma-string spaties mag bevatten, die syntactisch zelf geen betekenis hebben. Dit is in overeenkomst met de specificatie, maar op zich niet nodig.
+
+Het tweede geval van $\parsepgmop$ zorgt ervoor dat een programma-string
+bijvoorbeeld spaties mag bevatten, die syntactisch zelf geen betekenis hebben.
+Dit is in overeenkomst met de specificatie, maar op zich niet nodig.
+
$$
\parsestr s =
\begin{cases}
- \lambda:\parsepgm{s'} & \text{als $s=cs'$ met $c=$`''`}\\
- `\backslash`~k~\parsestr{s'} & \text{als $s=cs'$ met $c=$`$\backslash$`~$k$ en $k\in\Char$}\\
- c~\parsestr{s'} & \text{als $s=cs'$ met $c \in\Char\backslash\{`''`, `\backslash`\}$}\\
+ \lambda:\parsepgm{s'} & \text{als $s=\texttt{"}~s'$} \\
+ k~\parsestr{s'} & \text{als $s=\texttt{\textbackslash}~k~s'$ met
+ $k \in\Char$} \\
+ c~\parsestr{s'} & \text{als $s=c~s'$ met $c
+ \in\Char\setminus\{\texttt{"}\}$}\\
\end{cases}
$$
-Het tweede geval van $\parsestrop$ zorgt ervoor dat ge-escapete aanhalingstekens de string niet beëindigen.
+
+Het tweede geval van $\parsestrop$ zorgt ervoor dat ge-escapete
+aanhalingstekens de string niet beëindigen.
diff --git a/smurf.sty b/smurf.sty
index 433480b..e4d9e43 100644
--- a/smurf.sty
+++ b/smurf.sty
@@ -1,3 +1,5 @@
+\RequirePackage{amssymb}
+
% General
\def\isdef{\stackrel{\text{def}}{=}}
@@ -24,10 +26,10 @@
\def\push#1#2{\pushop\left(#1, #2\right)}
\def\pop#1{\popop\left(#1\right)}
-
% Store
\def\putop{\mathit{put}}
\def\put#1#2#3{\putop\left(#1, #2, #3\right)}
+\def\emptystore{\varnothing}
% Syntax
\def\SynPgm{\langle\Pgm\rangle}