Просмотр исходного кода

stdlib: Math (tan/arcsin/arccos/power), Strings (Equal/Pos), new CharClass module (+ Stdlib2Prog test, 112/112)

Eric Streit 1 неделя назад
Родитель
Сommit
32141c616f
8 измененных файлов с 143 добавлено и 0 удалено
  1. 1 0
      compiler/run_tests.sh
  2. 22 0
      compiler/tests/stdlib2_prog.mod
  3. 19 0
      stdlib/charclass.def
  4. 28 0
      stdlib/charclass.mod
  5. 4 0
      stdlib/math.def
  6. 27 0
      stdlib/math.mod
  7. 6 0
      stdlib/strings.def
  8. 36 0
      stdlib/strings.mod

+ 1 - 0
compiler/run_tests.sh

@@ -220,6 +220,7 @@ expect_run_files StorageProg 42 ../stdlib/storage.def ../stdlib/storage.mod stor
 expect_run_files ClashProg 60 d_clash_a.def d_clash_a.mod d_clash_b.def d_clash_b.mod d_clash_prog.mod
 expect_run_files_out Hello 0 "Hello, Modula-2!" ../stdlib/sysio.def ../stdlib/sysio.mod hello.mod
 expect_run_files_out StringsProg 0 "Hello World" ../stdlib/sysio.def ../stdlib/sysio.mod ../stdlib/strings.def ../stdlib/strings.mod strings_prog.mod
+expect_run_files_out Stdlib2Prog 42 "stdlib2 n=42" ../stdlib/sysio.def ../stdlib/sysio.mod ../stdlib/math.def ../stdlib/math.mod ../stdlib/strings.def ../stdlib/strings.mod ../stdlib/charclass.def ../stdlib/charclass.mod stdlib2_prog.mod
 expect_run_files MathProg 12 ../stdlib/sysio.def ../stdlib/sysio.mod ../stdlib/math.def ../stdlib/math.mod math_prog.mod
 
 expect_run_files_in() {

+ 22 - 0
compiler/tests/stdlib2_prog.mod

@@ -0,0 +1,22 @@
+MODULE Stdlib2Prog;
+(* Broadened stdlib: Math (sqrt/power/arcsin/arccos), Strings
+   (Assign/Equal/Pos), CharClass. Prints a line and exits 42. *)
+IMPORT SysIO, Math, Strings, CharClass;
+VAR ExitCode : INTEGER;
+VAR s : ARRAY [0..31] OF CHAR;
+VAR n : INTEGER;
+BEGIN
+  n := 0;
+  IF Math.sqrt(144.0) > 11.9 THEN n := n + 10 END;       (* 12    -> 10 *)
+  IF Math.power(2.0, 10.0) > 1023.9 THEN n := n + 10 END;(* 1024  -> 20 *)
+  IF Math.arcsin(0.0) = 0.0 THEN n := n + 2 END;         (*       -> 22 *)
+  IF Math.arccos(1.0) = 0.0 THEN n := n + 2 END;         (*       -> 24 *)
+  Strings.Assign("abc", s);
+  IF Strings.Equal("abc", s) THEN n := n + 6 END;        (*       -> 30 *)
+  IF Strings.Pos("bc", s) = 2 THEN n := n + 6 END;       (* 1-based -> 36 *)
+  IF CharClass.IsDigit('7') AND CharClass.IsAlpha('Q') THEN
+    n := n + 6                                           (*       -> 42 *)
+  END;
+  SysIO.Write("stdlib2 n="); SysIO.WriteInt(n); SysIO.WriteLn;
+  ExitCode := n
+END Stdlib2Prog.

+ 19 - 0
stdlib/charclass.def

@@ -0,0 +1,19 @@
+DEFINITION MODULE CharClass;
+(* ASCII character classification (classic ISO-style names). *)
+
+PROCEDURE IsDigit (ch : CHAR) : BOOLEAN;
+(* '0'..'9' *)
+
+PROCEDURE IsUpper (ch : CHAR) : BOOLEAN;
+(* 'A'..'Z' *)
+
+PROCEDURE IsLower (ch : CHAR) : BOOLEAN;
+(* 'a'..'z' *)
+
+PROCEDURE IsAlpha (ch : CHAR) : BOOLEAN;
+(* letter *)
+
+PROCEDURE IsSpace (ch : CHAR) : BOOLEAN;
+(* space, tab, CR, LF *)
+
+END CharClass.

+ 28 - 0
stdlib/charclass.mod

@@ -0,0 +1,28 @@
+IMPLEMENTATION MODULE CharClass;
+
+PROCEDURE IsDigit (ch : CHAR) : BOOLEAN;
+BEGIN
+  RETURN (ch >= "0") AND (ch <= "9")
+END IsDigit;
+
+PROCEDURE IsUpper (ch : CHAR) : BOOLEAN;
+BEGIN
+  RETURN (ch >= "A") AND (ch <= "Z")
+END IsUpper;
+
+PROCEDURE IsLower (ch : CHAR) : BOOLEAN;
+BEGIN
+  RETURN (ch >= "a") AND (ch <= "z")
+END IsLower;
+
+PROCEDURE IsAlpha (ch : CHAR) : BOOLEAN;
+BEGIN
+  RETURN IsUpper(ch) OR IsLower(ch)
+END IsAlpha;
+
+PROCEDURE IsSpace (ch : CHAR) : BOOLEAN;
+BEGIN
+  RETURN (ch = " ") OR (ch = CHR(9)) OR (ch = CHR(13)) OR (ch = CHR(10))
+END IsSpace;
+
+END CharClass.

+ 4 - 0
stdlib/math.def

@@ -9,7 +9,11 @@ PROCEDURE exp(x : REAL) : REAL;
 PROCEDURE ln(x : REAL) : REAL;
 PROCEDURE sin(x : REAL) : REAL;
 PROCEDURE cos(x : REAL) : REAL;
+PROCEDURE tan(x : REAL) : REAL;
+PROCEDURE arcsin(x : REAL) : REAL;
+PROCEDURE arccos(x : REAL) : REAL;
 PROCEDURE arctan(x : REAL) : REAL;
+PROCEDURE power(x, y : REAL) : REAL;
 PROCEDURE abs(x : REAL) : REAL;
 
 END Math.

+ 27 - 0
stdlib/math.mod

@@ -17,12 +17,39 @@ PROCEDURE sin(x : REAL) : REAL;
 PROCEDURE cos(x : REAL) : REAL;
   EXTERNAL;
 
+PROCEDURE tan(x : REAL) : REAL;
+  EXTERNAL;
+
+PROCEDURE asin(x : REAL) : REAL;
+  EXTERNAL;
+
+PROCEDURE acos(x : REAL) : REAL;
+  EXTERNAL;
+
 PROCEDURE arctan(x : REAL) : REAL;
   EXTERNAL;
 
+PROCEDURE pow(x, y : REAL) : REAL;
+  EXTERNAL;
+
 PROCEDURE fabs(x : REAL) : REAL;
   EXTERNAL;
 
+PROCEDURE arcsin(x : REAL) : REAL;
+BEGIN
+  RETURN asin(x)
+END arcsin;
+
+PROCEDURE arccos(x : REAL) : REAL;
+BEGIN
+  RETURN acos(x)
+END arccos;
+
+PROCEDURE power(x, y : REAL) : REAL;
+BEGIN
+  RETURN pow(x, y)
+END power;
+
 PROCEDURE abs(x : REAL) : REAL;
 BEGIN
   RETURN fabs(x)

+ 6 - 0
stdlib/strings.def

@@ -26,4 +26,10 @@ PROCEDURE Append(VAR src, dst : ARRAY OF CHAR);
 PROCEDURE Copy(VAR src, dst : ARRAY OF CHAR);
 (* Alias for Assign, ISO-style name. *)
 
+PROCEDURE Equal(VAR s1, s2 : ARRAY OF CHAR) : BOOLEAN;
+(* TRUE when the two strings have equal contents. *)
+
+PROCEDURE Pos(VAR pattern, s : ARRAY OF CHAR) : INTEGER;
+(* 1-based index of the leftmost occurrence of pattern in s, or 0. *)
+
 END Strings.

+ 36 - 0
stdlib/strings.mod

@@ -86,6 +86,42 @@ BEGIN
   dst[n + m] := CHR(0)
 END Append;
 
+PROCEDURE Equal (VAR s1, s2 : ARRAY OF CHAR) : BOOLEAN;
+VAR i, n1, n2 : INTEGER;
+BEGIN
+  n1 := Length(s1); n2 := Length(s2);
+  IF n1 # n2 THEN RETURN FALSE END;
+  i := 0;
+  WHILE i < n1 DO
+    IF s1[i] # s2[i] THEN RETURN FALSE END;
+    i := i + 1
+  END;
+  RETURN TRUE
+END Equal;
+
+PROCEDURE Pos (VAR pattern, s : ARRAY OF CHAR) : INTEGER;
+VAR i, j, np, ns : INTEGER;
+    found : BOOLEAN;
+BEGIN
+  np := Length(pattern);
+  ns := Length(s);
+  IF (np = 0) OR (np > ns) THEN RETURN 0 END;
+  i := 0;
+  WHILE i + np <= ns DO
+    j := 0; found := TRUE;
+    WHILE (j < np) AND found DO
+      IF s[i + j] # pattern[j] THEN
+        found := FALSE
+      ELSE
+        j := j + 1
+      END
+    END;
+    IF found THEN RETURN i + 1 END;
+    i := i + 1
+  END;
+  RETURN 0
+END Pos;
+
 PROCEDURE Compare (VAR s1, s2 : ARRAY OF CHAR) : INTEGER;
 VAR i, n1, n2, n : INTEGER;
 BEGIN