This test suite is written in Falderal format. It is far from exhaustive, but provides a basic sanity check that the language we've implemented comes close to PL-{GOTO}.
-> Tests for functionality "Parse PL-{GOTO} Program"
| n ← 0;
= Block [AssignZero "n"]
| n ← m;
= Block [AssignOther "n" "m"]
| n ← n + 1;
= Block [AssignIncr "n" "n"]
| n ← 0; LOOP n; m ← n; END;
= Block [AssignZero "n",Loop 0 "n" (Block [AssignOther "m" "n"])]
| n ← 0; m ← 0;
| LOOP n;
| m ← n + 1;
| END;
= Block [AssignZero "n",AssignZero "m",Loop 0 "n" (Block [AssignIncr "m" "n"])]
It's perfectly valid to have variables called LOOP and END.
| LOOP ← 0; LOOP LOOP; LOOP ← LOOP + 1; END;
= Block [AssignZero "LOOP",Loop 0 "LOOP" (Block [AssignIncr "LOOP" "LOOP"])]
| END ← 0; LOOP END; END ← END + 1; END;
= Block [AssignZero "END",Loop 0 "END" (Block [AssignIncr "END" "END"])]
-> Tests for functionality "Label PL-{GOTO} Loops"
| n ← 0; m ← 0; LOOP n;
| LOOP m;
| n ← 0;
| END;
| END;
= (Block [AssignZero "n",AssignZero "m",Loop 1 "n" (Block [Loop 0 "m" (Block [AssignZero "n"])])],2)
-> Tests for functionality "Evaluate PL-{GOTO} Program"
| n ← 0;
= n=0
| n ← 0; m ← n + 1; n ← m + 1;
= m=1
= n=2
| m ← 0; n ← 0; LOOP n; m ← n; END;
= m=0
= n=0
| n ← 0; n ← n + 1; LOOP n; m ← n; END;
= m=1
= n=1
| m ← 0; n ← 0; n ← n + 1; n ← n + 1; LOOP n; m ← m + 1; END;
= m=2
= n=2
| n ← 0; n ← n + 1; n ← n + 1; n ← n + 1; n ← n + 1;
| m ← 0; k ← 0;
| LOOP n;
| m ← m + 1;
| LOOP m;
| k ← k + 1;
| END;
| END;
= k=10
= m=4
= n=4
Changing the value of a loop variable inside the loop does not change the number of times the loop executes.
| n ← 0; n ← n + 1; n ← n + 1; n ← n + 1; n ← n + 1;
| m ← 0;
| LOOP n;
| n ← 0; n ← n + 1;
| m ← m + 1;
| END;
= m=4
= n=1
The interpreter and the compiled program currently have different behaviour
for this case. The compiled program never executes the loop, so never sees
m
, so doesn't introduce m
into the environment, so doesn't print m=0
.
> | n ← 0; LOOP n; m ← n; END;
> = m=0
> = n=0