diff options
-rw-r--r-- | defstate.tex | 6 | ||||
-rw-r--r-- | preamble.tex | 3 | ||||
-rw-r--r-- | rules.tex | 2 | ||||
-rw-r--r-- | rulesexec.tex | 60 | ||||
-rw-r--r-- | smurf.sty | 4 |
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{"}} + @@ -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. @@ -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} |