|
|
@@ -0,0 +1,270 @@
|
|
|
+Listing:
|
|
|
+
|
|
|
+ 1 MODULE Showcase;
|
|
|
+ 2
|
|
|
+ 3 (* Tour of everything M2c + mcint can do so far (steps 1-6):
|
|
|
+ 4 scalars, control flow, procedures, composites, sets,
|
|
|
+ 5 pointers, strings, open arrays, I/O and a local MODULE. *)
|
|
|
+ 6
|
|
|
+ 7 MODULE Stats
|
|
|
+ 8
|
|
|
+ 9 EXPORT count, Bump, Limit;
|
|
|
+ 10
|
|
|
+ 11 VAR
|
|
|
+ 12 count : INTEGER;
|
|
|
+ 13
|
|
|
+ 14 CONST
|
|
|
+ 15 Limit = 100;
|
|
|
+ 16
|
|
|
+ 17 PROCEDURE Bump;
|
|
|
+ 18 BEGIN
|
|
|
+ 19 count := count + 1
|
|
|
+ 20 END Bump;
|
|
|
+ 21
|
|
|
+ 22 END Stats;
|
|
|
+ 23
|
|
|
+ 24 TYPE
|
|
|
+ 25 Color = (Red, Green, Blue);
|
|
|
+ 26 Inner = RECORD u, v : INTEGER END;
|
|
|
+ 27 Pair = RECORD a : INTEGER; b : Inner END;
|
|
|
+ 28 Node = RECORD val : INTEGER; next : POINTER TO Node END;
|
|
|
+ 29 PNode = POINTER TO Node;
|
|
|
+ 30
|
|
|
+ 31 VAR
|
|
|
+ 32 total, x, y, i, f, w, k : INTEGER;
|
|
|
+ 33 flag : BOOLEAN;
|
|
|
+ 34 ch : CHAR;
|
|
|
+ 35 col : Color;
|
|
|
+ 36 r : REAL;
|
|
|
+ 37 a, b : ARRAY [1 .. 5] OF INTEGER;
|
|
|
+ 38 m1, m2, m3 : ARRAY [1 .. 2], [1 .. 2] OF INTEGER;
|
|
|
+ 39 rec : Pair;
|
|
|
+ 40 s1, s2, u, n, d : SET OF [0 .. 15];
|
|
|
+ 41 head, spare : PNode;
|
|
|
+ 42 s, t, s1c : ARRAY [1 .. 10] OF CHAR;
|
|
|
+ 43 ExitCode : INTEGER;
|
|
|
+ 44
|
|
|
+ 45 PROCEDURE Double(x : INTEGER) : INTEGER;
|
|
|
+ 46 BEGIN
|
|
|
+ 47 RETURN x * 2
|
|
|
+ 48 END Double;
|
|
|
+ 49
|
|
|
+ 50 PROCEDURE Incr(VAR x : INTEGER);
|
|
|
+ 51 BEGIN
|
|
|
+ 52 x := x + 1
|
|
|
+ 53 END Incr;
|
|
|
+ 54
|
|
|
+ 55 PROCEDURE Fact(n : INTEGER) : INTEGER;
|
|
|
+ 56 BEGIN
|
|
|
+ 57 IF n <= 1 THEN RETURN 1 ELSE RETURN n * Fact(n - 1) END
|
|
|
+ 58 END Fact;
|
|
|
+ 59
|
|
|
+ 60 PROCEDURE IsEven(n : INTEGER) : BOOLEAN;
|
|
|
+ 61 FORWARD;
|
|
|
+ 62
|
|
|
+ 63 PROCEDURE IsOdd(n : INTEGER) : BOOLEAN;
|
|
|
+ 64 BEGIN
|
|
|
+ 65 IF n = 0 THEN RETURN FALSE ELSE RETURN IsEven(n - 1) END
|
|
|
+ 66 END IsOdd;
|
|
|
+ 67
|
|
|
+ 68 PROCEDURE IsEven(n : INTEGER) : BOOLEAN;
|
|
|
+ 69 BEGIN
|
|
|
+ 70 IF n = 0 THEN RETURN TRUE ELSE RETURN IsOdd(n - 1) END
|
|
|
+ 71 END IsEven;
|
|
|
+ 72
|
|
|
+ 73 PROCEDURE Outer : INTEGER;
|
|
|
+ 74 PROCEDURE Inner : INTEGER;
|
|
|
+ 75 BEGIN
|
|
|
+ 76 RETURN 6
|
|
|
+ 77 END Inner;
|
|
|
+ 78 BEGIN
|
|
|
+ 79 RETURN Inner() + 1
|
|
|
+ 80 END Outer;
|
|
|
+ 81
|
|
|
+ 82 PROCEDURE SumOpen(x : ARRAY OF INTEGER) : INTEGER;
|
|
|
+ 83 VAR i, s : INTEGER;
|
|
|
+ 84 BEGIN
|
|
|
+ 85 s := 0;
|
|
|
+ 86 FOR i := 0 TO HIGH(x) DO
|
|
|
+ 87 s := s + x[i]
|
|
|
+ 88 END;
|
|
|
+ 89 RETURN s
|
|
|
+ 90 END SumOpen;
|
|
|
+ 91
|
|
|
+ 92 PROCEDURE Append(v : INTEGER);
|
|
|
+ 93 VAR q, r : PNode;
|
|
|
+ 94 BEGIN
|
|
|
+ 95 NEW(q);
|
|
|
+ 96 q^.val := v;
|
|
|
+ 97 q^.next := NIL;
|
|
|
+ 98 IF head = NIL THEN
|
|
|
+ 99 head := q
|
|
|
+ 100 ELSE
|
|
|
+ 101 r := head;
|
|
|
+ 102 WHILE r^.next # NIL DO
|
|
|
+ 103 r := r^.next
|
|
|
+ 104 END;
|
|
|
+ 105 r^.next := q
|
|
|
+ 106 END
|
|
|
+ 107 END Append;
|
|
|
+ 108
|
|
|
+ 109 PROCEDURE ListSum(p : PNode) : INTEGER;
|
|
|
+ 110 BEGIN
|
|
|
+ 111 IF p = NIL THEN
|
|
|
+ 112 RETURN 0
|
|
|
+ 113 ELSE
|
|
|
+ 114 RETURN p^.val + ListSum(p^.next)
|
|
|
+ 115 END
|
|
|
+ 116 END ListSum;
|
|
|
+ 117
|
|
|
+ 118 BEGIN
|
|
|
+ 119 total := 0;
|
|
|
+ 120 WriteString("tour");
|
|
|
+ 121 Stats.count := 0;
|
|
|
+ 122 Stats.Bump();
|
|
|
+ 123 Stats.Bump();
|
|
|
+ 124 Stats.Bump();
|
|
|
+ 125 total := total + Stats.count;
|
|
|
+ 126 IF Stats.Limit = 100 THEN
|
|
|
+ 127 total := total + 1
|
|
|
+ 128 END;
|
|
|
+ 129 x := 6 * 7 - 2;
|
|
|
+ 130 total := total + x DIV 10;
|
|
|
+ 131 y := x MOD 7;
|
|
|
+ 132 total := total + y;
|
|
|
+ 133 r := 3.5 + 2.25;
|
|
|
+ 134 IF (r > 5.0) AND (r < 6.0) THEN
|
|
|
+ 135 total := total + 2
|
|
|
+ 136 END;
|
|
|
+ 137 ch := "A";
|
|
|
+ 138 IF ch = "A" THEN
|
|
|
+ 139 total := total + 1
|
|
|
+ 140 END;
|
|
|
+ 141 IF ch < "B" THEN
|
|
|
+ 142 total := total + 1
|
|
|
+ 143 END;
|
|
|
+ 144 flag := (x > y) AND (y > 0);
|
|
|
+ 145 IF flag THEN
|
|
|
+ 146 total := total + 1
|
|
|
+ 147 END;
|
|
|
+ 148 flag := NOT flag OR FALSE;
|
|
|
+ 149 IF ~flag THEN
|
|
|
+ 150 total := total + 1
|
|
|
+ 151 END;
|
|
|
+ 152 col := Green;
|
|
|
+ 153 CASE col OF
|
|
|
+ 154 Red : total := total + 0 |
|
|
|
+ 155 Green : total := total + 3 |
|
|
|
+ 156 Blue : total := total + 5
|
|
|
+ 157 END;
|
|
|
+ 158 k := 2;
|
|
|
+ 159 CASE k OF
|
|
|
+ 160 1 : total := total + 0 |
|
|
|
+ 161 2 : total := total + 4
|
|
|
+ 162 ELSE
|
|
|
+ 163 total := total + 0
|
|
|
+ 164 END;
|
|
|
+ 165 i := 0; w := 0;
|
|
|
+ 166 WHILE i < 4 DO
|
|
|
+ 167 i := i + 1;
|
|
|
+ 168 w := w + i
|
|
|
+ 169 END;
|
|
|
+ 170 total := total + w DIV 5;
|
|
|
+ 171 i := 0;
|
|
|
+ 172 REPEAT
|
|
|
+ 173 i := i + 1
|
|
|
+ 174 UNTIL i >= 3;
|
|
|
+ 175 total := total + i;
|
|
|
+ 176 i := 0;
|
|
|
+ 177 LOOP
|
|
|
+ 178 i := i + 1;
|
|
|
+ 179 IF i = 3 THEN
|
|
|
+ 180 EXIT
|
|
|
+ 181 END
|
|
|
+ 182 END;
|
|
|
+ 183 total := total + i;
|
|
|
+ 184 f := 0;
|
|
|
+ 185 FOR i := 1 TO 5 DO
|
|
|
+ 186 f := f + i
|
|
|
+ 187 END;
|
|
|
+ 188 total := total + f MOD 10;
|
|
|
+ 189 IF x > 100 THEN
|
|
|
+ 190 total := total + 0
|
|
|
+ 191 ELSIF x > 10 THEN
|
|
|
+ 192 total := total + 2
|
|
|
+ 193 ELSE
|
|
|
+ 194 total := total + 0
|
|
|
+ 195 END;
|
|
|
+ 196 total := total + Double(21) DIV 10;
|
|
|
+ 197 Incr(x);
|
|
|
+ 198 total := total + x MOD 10;
|
|
|
+ 199 total := total + Fact(5) DIV 100;
|
|
|
+ 200 IF IsEven(10) THEN
|
|
|
+ 201 total := total + 1
|
|
|
+ 202 END;
|
|
|
+ 203 total := total + Outer();
|
|
|
+ 204 a[1] := 5; a[2] := 4; a[3] := 3; a[4] := 2; a[5] := 1;
|
|
|
+ 205 b := a;
|
|
|
+ 206 total := total + b[1];
|
|
|
+ 207 total := total + HIGH(a);
|
|
|
+ 208 total := total + SumOpen(a);
|
|
|
+ 209 m1[1,1] := 1; m1[1,2] := 2; m1[2,1] := 3; m1[2,2] := 4;
|
|
|
+ 210 m2[1,1] := 5; m2[1,2] := 6; m2[2,1] := 7; m2[2,2] := 8;
|
|
|
+ 211 m3[1,1] := m1[1,1]*m2[1,1] + m1[1,2]*m2[2,1];
|
|
|
+ 212 m3[1,2] := m1[1,1]*m2[1,2] + m1[1,2]*m2[2,2];
|
|
|
+ 213 m3[2,1] := m1[2,1]*m2[1,1] + m1[2,2]*m2[2,1];
|
|
|
+ 214 m3[2,2] := m1[2,1]*m2[1,2] + m1[2,2]*m2[2,2];
|
|
|
+ 215 total := total + (m3[1,1] + m3[2,2]) MOD 20;
|
|
|
+ 216 rec.a := 1;
|
|
|
+ 217 rec.b.u := 10;
|
|
|
+ 218 rec.b.v := 20;
|
|
|
+ 219 WITH rec DO
|
|
|
+ 220 a := a + 1;
|
|
|
+ 221 WITH b DO
|
|
|
+ 222 u := u + 2;
|
|
|
+ 223 v := v + 3
|
|
|
+ 224 END
|
|
|
+ 225 END;
|
|
|
+ 226 total := total + rec.a + rec.b.u + rec.b.v;
|
|
|
+ 227 s1 := {1 .. 5};
|
|
|
+ 228 s2 := {4 .. 8};
|
|
|
+ 229 u := s1 + s2;
|
|
|
+ 230 n := s1 * s2;
|
|
|
+ 231 d := s1 - s2;
|
|
|
+ 232 IF (1 IN u) AND (5 IN n) AND (2 IN d) THEN
|
|
|
+ 233 total := total + 5
|
|
|
+ 234 END;
|
|
|
+ 235 IF u = u THEN
|
|
|
+ 236 total := total + 1
|
|
|
+ 237 END;
|
|
|
+ 238 head := NIL;
|
|
|
+ 239 Append(4);
|
|
|
+ 240 Append(7);
|
|
|
+ 241 Append(9);
|
|
|
+ 242 total := total + ListSum(head);
|
|
|
+ 243 NEW(spare);
|
|
|
+ 244 DISPOSE(spare);
|
|
|
+ 245 s := "ok";
|
|
|
+ 246 t := "ok";
|
|
|
+ 247 IF s = t THEN
|
|
|
+ 248 total := total + 2
|
|
|
+ 249 END;
|
|
|
+ 250 WriteString(s);
|
|
|
+ 251 t := "abc";
|
|
|
+ 252 IF t # s THEN
|
|
|
+ 253 total := total + 1
|
|
|
+ 254 END;
|
|
|
+ 255 IF s > t THEN
|
|
|
+ 256 total := total + 1
|
|
|
+ 257 END;
|
|
|
+ 258 s1c := "okx";
|
|
|
+ 259 IF s1c > s THEN
|
|
|
+ 260 total := total + 1
|
|
|
+ 261 END;
|
|
|
+ 262 WriteInt(total);
|
|
|
+ 263 ExitCode := total
|
|
|
+ 264 END Showcase.
|
|
|
+
|
|
|
+ 0 errors
|
|
|
+
|
|
|
+
|