Преглед на файлове

v3 step 3.5 — showcase8 complete tour (57/57 tests green)

Eric Streit преди 3 седмици
родител
ревизия
057524adda
променени са 2 файла, в които са добавени 66 реда и са изтрити 0 реда
  1. 1 0
      compiler/run_tests.sh
  2. 65 0
      compiler/tests/showcase8.mod

+ 1 - 0
compiler/run_tests.sh

@@ -74,6 +74,7 @@ expect_run showcase4.mod 44
 expect_fail showcase5.mod "not supported yet"
 expect_fail showcase5.mod "not supported yet"
 expect_run showcase6.mod 34
 expect_run showcase6.mod 34
 expect_run showcase7.mod 219
 expect_run showcase7.mod 219
+expect_run showcase8.mod 170
 expect_fail t_enumdecl.mod "not supported yet"
 expect_fail t_enumdecl.mod "not supported yet"
 expect_fail t_proc.mod "not supported yet"
 expect_fail t_proc.mod "not supported yet"
 expect_fail t_forward.mod "not supported yet"
 expect_fail t_forward.mod "not supported yet"

+ 65 - 0
compiler/tests/showcase8.mod

@@ -0,0 +1,65 @@
+MODULE Showcase8;
+// Complete tour at v3-step3.4: CONSTs, subranges, arrays (flat +
+// nested + copies), strings, sets, records, WITH (nested),
+// REALs, all control flow. Expected ExitCode: 170.
+CONST K = 10;
+TYPE Score = [0..20];
+TYPE Vec = ARRAY [0..4] OF INTEGER;
+TYPE Mat = ARRAY [0..1, 0..2] OF INTEGER;
+TYPE Small = SET OF [0..7];
+TYPE Point = RECORD x, y : INTEGER END;
+TYPE Rect = RECORD org, ext : Point; tags : ARRAY [0..1] OF INTEGER END;
+VAR ExitCode, i, sum : INTEGER;
+VAR sc : Score;
+VAR v : Vec;
+VAR m : Mat;
+VAR s : Small;
+VAR r : REAL;
+VAR t : ARRAY [0..2] OF CHAR;
+VAR rc : Rect;
+BEGIN
+  (* 0+10+20+30+40 = 100 *)
+  sum := 0;
+  FOR i := 0 TO 4 DO v[i] := i * K; sum := sum + v[i] END;
+  m[0, 0] := 1; m[0, 1] := 2; m[0, 2] := 3;
+  m[1, 0] := 4; m[1, 1] := 5; m[1, 2] := 6;
+  (* +6 = 106 *)
+  sum := sum + m[1, 2];
+  (* {1,3,5}+{3,4}; 4 IN -> +1 = 107 *)
+  s := {1, 3, 5} + {3, 4};
+  IF 4 IN s THEN sum := sum + 1 END;
+  (* "abc"; t[1] = 'b' -> +2 = 109 *)
+  t := "abc";
+  IF t[1] = 'b' THEN sum := sum + 2 END;
+  (* rc.org = (20, 22) -> +42 = 151 *)
+  rc.org.x := 20;
+  WITH rc DO
+    WITH org DO
+      y := x + 2
+    END
+  END;
+  sum := sum + rc.org.x + rc.org.y;
+  (* subrange -> +7 = 158 *)
+  sc := 7;
+  sum := sum + sc;
+  (* 158/2+0.5 = 79.5 > 79 -> +10 = 168 *)
+  r := sum;
+  r := r / 2.0 + 0.5;
+  IF r > 79.0 THEN sum := sum + 10 END;
+  (* 168 MOD 5 = 3 -> +1 = 169 *)
+  CASE sum MOD 5 OF
+    0..1 : sum := sum + 100
+  | 2..3 : sum := sum + 1
+  ELSE sum := sum + 1000
+  END;
+  (* down to 165 *)
+  WHILE sum > 165 DO sum := sum - 1 END;
+  (* up to 167 *)
+  REPEAT sum := sum + 1 UNTIL sum >= 167;
+  (* up to 170 *)
+  LOOP
+    IF sum >= 170 THEN EXIT END;
+    sum := sum + 1
+  END;
+  ExitCode := sum
+END Showcase8.