summaryrefslogtreecommitdiff
path: root/rulesexec.tex
blob: 26d264f55a3a4f77b0928a509e945a8e64695474 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
% vim: set spelllang=nl:
\subsection{\texttt{Exec}}
\label{sec:rules:exec}

\begin{quote}
	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. Hieronder zullen we $\parsepgmop$ definiëren. 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.
\therexecns%

\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=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
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=\texttt{"}~s'$} \\
			\unescape{c}~\parsestr{s'} & \text{als $s=\texttt{\textbackslash}~c~s'$
				met $c \in\Char$} \\
			c~\parsestr{s'} & \text{als $s=c~s'$ met $c
				\in\Char\setminus\{\texttt{"},\texttt{\textbackslash}\}$}\\
		\end{cases}
$$

Het tweede geval van $\parsestrop$ zorgt ervoor dat ge-escapete
aanhalingstekens de string niet beëindigen. Hierbij gebruiken we $\unescapeop$
om bepaalde karakters te unescapen. Deze functie is gedefinieerd in
\autoref{sec:rules:push}.