⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sets.mod

📁 一个Modula-2语言分析器
💻 MOD
字号:
IMPLEMENTATION MODULE Sets;

IMPORT FileIO;

(* Clear                Clear all elements in set s      
---------------------------------------------------------------------------*)
PROCEDURE Clear (VAR s: ARRAY OF BITSET);
  VAR
    i: CARDINAL;
  BEGIN
    i := 0; WHILE i <= HIGH(s) DO s[i] := BITSET{}; INC(i) END
  END Clear;


(* Fill                 Set all elements in set s
---------------------------------------------------------------------------*)
PROCEDURE Fill (VAR s: ARRAY OF BITSET);
  VAR
    i: CARDINAL;
  BEGIN
    i := 0; WHILE i <= HIGH(s) DO s[i] := BITSET{0 .. size - 1}; INC(i) END
  END Fill;


(* Incl                 Include element x in set s
---------------------------------------------------------------------------*)
PROCEDURE Incl (VAR s: ARRAY OF BITSET; x: CARDINAL);
  BEGIN
    INCL(s[x DIV size], x MOD size)
  END Incl;


(* Excl
---------------------------------------------------------------------------*)
PROCEDURE Excl (VAR s: ARRAY OF BITSET; x: CARDINAL);
  BEGIN
    EXCL(s[x DIV size], x MOD size)
  END Excl;


(* In                   TRUE, if element x is contained in set s
---------------------------------------------------------------------------*)
PROCEDURE In (VAR s: ARRAY OF BITSET; x: CARDINAL): BOOLEAN;
  BEGIN
    RETURN x MOD size IN s[x DIV size]
  END In;


(* Includes             TRUE, if s2 in s1
---------------------------------------------------------------------------*)
PROCEDURE Includes (VAR s1, s2: ARRAY OF BITSET): BOOLEAN;
  VAR
    i: CARDINAL;
  BEGIN
    i := 0;
    WHILE i <= HIGH(s1) DO
      IF ~ (s2[i] <= s1[i]) THEN RETURN FALSE END;
      INC(i)
    END;
    RETURN TRUE;
  END Includes;


(* Elements             Return number of elements in set s
---------------------------------------------------------------------------*)
PROCEDURE Elements (VAR s: ARRAY OF BITSET; VAR lastElem: INTEGER): INTEGER;
  VAR
    i, n, max: CARDINAL;
  BEGIN
    i := 0; n := 0; max := (HIGH(s) + 1) * size;
    WHILE i < max DO
      IF i MOD size IN s[i DIV size] THEN INC(n); lastElem := i END;
      INC(i)
    END;
    RETURN n
  END Elements;


(* Empty                TRUE, if set s i sempty
---------------------------------------------------------------------------*)
PROCEDURE Empty (VAR s: ARRAY OF BITSET): BOOLEAN;
  VAR
    i: CARDINAL;
  BEGIN
    i := 0;
    WHILE i <= HIGH(s) DO
      IF s[i] # BITSET{} THEN RETURN FALSE END;
      INC(i)
    END;
    RETURN TRUE
  END Empty;


(* Equal                TRUE, if set s1 and s2 are equal
---------------------------------------------------------------------------*)
PROCEDURE Equal (VAR s1, s2: ARRAY OF BITSET): BOOLEAN;
  VAR
    i: CARDINAL;
  BEGIN
    i := 0;
    WHILE i <= HIGH(s1) DO
      IF s1[i] # s2[i] THEN RETURN FALSE END;
      INC(i)
    END;
    RETURN TRUE
  END Equal;


(* Different            TRUE, if set s1 and s2 are totally different
---------------------------------------------------------------------------*)
PROCEDURE Different (VAR s1, s2: ARRAY OF BITSET): BOOLEAN;
  VAR
    i: CARDINAL;
  BEGIN
    i := 0;
    WHILE i <= HIGH(s1) DO
      IF s1[i] * s2[i] # BITSET{} THEN RETURN FALSE END;
      INC(i)
    END;
    RETURN TRUE
  END Different;


(* Unite                s1 := s1 + s2
---------------------------------------------------------------------------*)
PROCEDURE Unite (VAR s1, s2: ARRAY OF BITSET);
  VAR
    i: CARDINAL;
  BEGIN
    i := 0; WHILE i <= HIGH(s1) DO s1[i] := s1[i] + s2[i]; INC(i) END
  END Unite;


(* Differ               s1 := s1 - s2
---------------------------------------------------------------------------*)
PROCEDURE Differ (VAR s1, s2: ARRAY OF BITSET);
  VAR
    i: CARDINAL;
  BEGIN
    i := 0; WHILE i <= HIGH(s1) DO s1[i] := s1[i] - s2[i]; INC(i) END
  END Differ;


(* Intersect            s3 := s1 * s2
---------------------------------------------------------------------------*)
PROCEDURE Intersect (VAR s1, s2, s3: ARRAY OF BITSET);
  VAR
    i: CARDINAL;
  BEGIN
    i := 0; WHILE i <= HIGH(s1) DO s3[i] := s1[i] * s2[i]; INC(i) END
  END Intersect;


(* Print                Print set s
---------------------------------------------------------------------------*)
PROCEDURE Print (f: FileIO.File; s: ARRAY OF BITSET; w, indent: INTEGER);
  VAR
    col, i, max: INTEGER;
  BEGIN
    i := 0; col := indent; max := (HIGH(s) + 1) * size;
    FileIO.Write(f, "{");
    WHILE i < max DO
      IF In(s, i) THEN
        IF col + 4 > w THEN
          FileIO.WriteLn(f); FileIO.WriteText(f, "", indent); col := indent
        END;
        FileIO.WriteInt(f, i, 3); FileIO.Write(f, ",");
        INC(col, 4)
      END;
      INC(i)
    END;
    FileIO.Write(f, "}")
  END Print;


END Sets.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -