39 | 39 |
| END ← 0; LOOP END; END ← END + 1; END;
|
40 | 40 |
= Block [AssignZero "END",Loop 0 "END" (Block [AssignIncr "END" "END"])]
|
41 | 41 |
|
|
42 |
Loop Labeling
|
|
43 |
-------------
|
|
44 |
|
|
45 |
-> Tests for functionality "Label PL-{GOTO} Loops"
|
|
46 |
|
|
47 |
-> Functionality "Label PL-{GOTO} Loops" is implemented by
|
|
48 |
-> shell command
|
|
49 |
-> "ghc src/PLexceptGOTOdotNET.lhs -e "loopLabelFile \"%(test-file)\"""
|
|
50 |
|
|
51 |
| n ← 0; m ← 0; LOOP n;
|
|
52 |
| LOOP m;
|
|
53 |
| n ← 0;
|
|
54 |
| END;
|
|
55 |
| END;
|
|
56 |
= (Block [AssignZero "n",AssignZero "m",Loop 1 "n" (Block [Loop 0 "m" (Block [AssignZero "n"])])],2)
|
|
57 |
|
42 | 58 |
PL-{GOTO} Evaluation
|
43 | 59 |
--------------------
|
44 | 60 |
|
|
46 | 62 |
|
47 | 63 |
-> Functionality "Evaluate PL-{GOTO} Program" is implemented by
|
48 | 64 |
-> shell command
|
49 | |
-> "ghc src/PLexceptGOTOdotNET.lhs -e "runFile \"%(test-file)\"""
|
|
65 |
-> "bin/PLexceptGOTOdotNET interpret %(test-file)"
|
50 | 66 |
|
51 | 67 |
| n ← 0;
|
52 | 68 |
= [("n",0)]
|
|
69 |
|
|
70 |
| n ← 0; m ← n + 1; n ← m + 1;
|
|
71 |
= [("m",1),("n",2)]
|
53 | 72 |
|
54 | 73 |
| n ← 0; LOOP n; m ← n; END;
|
55 | 74 |
= [("n",0)]
|
|
81 | 100 |
| END;
|
82 | 101 |
= [("m",4),("n",1)]
|
83 | 102 |
|
84 | |
Loop Labeling
|
85 | |
-------------
|
|
103 |
Compiling
|
|
104 |
---------
|
86 | 105 |
|
87 | |
-> Tests for functionality "Label PL-{GOTO} Loops"
|
|
106 |
-> Tests for functionality "Compile PL-{GOTO} to .NET Executable"
|
88 | 107 |
|
89 | |
-> Functionality "Label PL-{GOTO} Loops" is implemented by
|
|
108 |
-> Functionality "Compile PL-{GOTO} to .NET Executable" is implemented by
|
90 | 109 |
-> shell command
|
91 | |
-> "ghc src/PLexceptGOTOdotNET.lhs -e "loopLabelFile \"%(test-file)\"""
|
|
110 |
-> "bin/PLexceptGOTOdotNET run %(test-file)"
|
92 | 111 |
|
93 | |
| n ← 0; m ← 0; LOOP n;
|
|
112 |
(Ideally we should just re-use the tests above for "PL-{GOTO} Evaluation", but
|
|
113 |
unfortunately the programs produced by the compiler have a different output
|
|
114 |
syntax right now. Also, the compiler puts all variables in the output
|
|
115 |
dictionary, with unassigned variables given the value 0, instead of being not
|
|
116 |
present in the output dictionary.)
|
|
117 |
|
|
118 |
| n ← 0;
|
|
119 |
= n=0
|
|
120 |
|
|
121 |
| n ← 0; m ← n + 1; n ← m + 1;
|
|
122 |
= m=1
|
|
123 |
= n=2
|
|
124 |
|
|
125 |
| n ← 0; LOOP n; m ← n; END;
|
|
126 |
= m=0
|
|
127 |
= n=0
|
|
128 |
|
|
129 |
| n ← 0; n ← n + 1; LOOP n; m ← n; END;
|
|
130 |
= m=1
|
|
131 |
= n=1
|
|
132 |
|
|
133 |
| m ← 0; n ← 0; n ← n + 1; n ← n + 1; LOOP n; m ← m + 1; END;
|
|
134 |
= m=2
|
|
135 |
= n=2
|
|
136 |
|
|
137 |
| n ← 0; n ← n + 1; n ← n + 1; n ← n + 1; n ← n + 1;
|
|
138 |
| m ← 0; k ← 0;
|
|
139 |
| LOOP n;
|
|
140 |
| m ← m + 1;
|
94 | 141 |
| LOOP m;
|
95 | |
| n ← 0;
|
|
142 |
| k ← k + 1;
|
96 | 143 |
| END;
|
97 | 144 |
| END;
|
98 | |
= (Block [AssignZero "n",AssignZero "m",Loop 1 "n" (Block [Loop 0 "m" (Block [AssignZero "n"])])],2)
|
|
145 |
= k=10
|
|
146 |
= m=4
|
|
147 |
= n=4
|
|
148 |
|
|
149 |
| n ← 0; n ← n + 1; n ← n + 1; n ← n + 1; n ← n + 1;
|
|
150 |
| m ← 0;
|
|
151 |
| LOOP n;
|
|
152 |
| n ← 0; n ← n + 1;
|
|
153 |
| m ← m + 1;
|
|
154 |
| END;
|
|
155 |
= m=4
|
|
156 |
= n=1
|