semantiek en syntax aangepast
[sec1415.git] / an_faculteit.tex
1 \subsection{Faculteit}
2 Als we de analyse op een compleet programma toepassen komt er een \textit{Piet}
3 programma uit dat behoorlijk fors is maar netjes zijn werk doet. Dit programma
4 berekent de faculteit van $x$ en stopt dat uiteindelijk in $y$.
5 \begin{lstlisting}[title=Faculteit in \textit{While}]
6 x:=5;
7 y:=1;
8 while $\neg$(x=1)
9 do (
10 y:=y*x;
11 x:=x-1
12 )
13 \end{lstlisting}
14
15 In \textit{Piet} ziet dit er als volgt uit...
16 \begin{lstlisting}[title=Faculteit in \textit{Piet'}]
17 push 5 // x is vanaf nu variabele 1
18 push 1 // y is vanaf nu variabele 2
19
20 MARKERING A:
21 Un(1) // variabele x wordt klaargezet
22 push 1 // de waarde 1 wordt klaargezet
23 sub // subtractie om straks gelijkheid te kunnen bepalen
24 push 1 // de waarde 1 word gepushed om 0 te maken
25 dup // de waarde 1 staat er nu twee keer op
26 sub // 0 staat op de stack om groterdan relatie te bepalen
27 push 2 // klaarmaken om de bovenste twee te swappen
28 push 1 // idem
29 roll // swappen
30 gre // als x>0 dan ligt 1 op de stack anders 0
31 not // als x=0 dan ligt 1 op de stack anders 0
32 pointer // als x=0 dan draait de DP niet en gaat het programma naar pad A
33 // als x$\neq$ dan draait de DP en gaat het programma naar pad B
34
35 PAD A:
36 skip //een oneindig aantal witte blokken, y is nu x!
37
38 PAD B:
39 Bin(1, 2) // x en y worden klaargezet om y opnieuw te assignen
40 mul // x*y ligt boven op de stack
41 Ass(2) // x*y wordt geassigned aan y
42 Un(1) // x wordt klaargezet
43 push 1 // 1 wordt klaargezet
44 sub // x-1 ligt op de stack
45 Ass(1) // x-1 wordt geassigned aan x
46 // nu gaat het programma weer via een wit pad naar markering A
47
48 \end{lstlisting}