DEADSOFTWARE

reimplenet DEFINED as operator
[cpc.git] / src / generic / Dev / Mod / CPR.cp
index 233b12166f49d168784e965a08de086fcda5069f..aaf4c8afb54ce95487c4b72639b82485e631594f 100644 (file)
@@ -7,10 +7,10 @@ MODULE DevCPR;
 
     (* symbol values *)
     null = 0;
-    if = 1; then = 2; else = 3; elsif = 4; end = 5; new = 6;
-    ident = 7; plus = 8; minus = 9;
-    not = 10; and = 11; or = 12; rpar = 13; lpar = 14;
-    endcom = 15; eof = 16;
+    if = 1; then = 2; else = 3; elsif = 4; end = 5;
+    new = 6; error = 7; ident = 8; plus = 9; minus = 10;
+    not = 11; and = 12; or = 13; rpar = 14; lpar = 15; defined = 16;
+    endcom = 17; eof = 18;
 
   TYPE
     Context = POINTER TO RECORD
@@ -66,16 +66,18 @@ MODULE DevCPR;
         IF ch = ">" THEN sym := endcom; DevCPM.Get(ch) END
     | "+": sym := plus; DevCPM.Get(ch)
     | "-": sym := minus; DevCPM.Get(ch)
+    | "D": Identifier(sym); IF name = "DEFINED" THEN sym := defined END
     | "E": Identifier(sym);
         IF name = "END" THEN sym := end
         ELSIF name = "ELSE" THEN sym := else
         ELSIF name = "ELSIF" THEN sym := elsif
+        ELSIF name = "ERROR" THEN sym := error
         END
     | "I": Identifier(sym); IF name = "IF" THEN sym := if END
     | "N": Identifier(sym); IF name = "NEW" THEN sym := new END
     | "O": Identifier(sym); IF name = "OR" THEN sym := or END
     | "T": Identifier(sym); IF name = "THEN" THEN sym := then END
-    | "A".."D", "J".."M", "P".."S", "U".."Z", "a".."z", "_": Identifier(sym)
+    | "A".."C", "J".."M", "P".."S", "U".."Z", "a".."z", "_": Identifier(sym)
     | "~": sym := not; DevCPM.Get(ch)
     ELSE
       IF Strings.IsIdent(ch) THEN Identifier(sym) ELSE sym := null; DevCPM.Get(ch) END
@@ -116,15 +118,30 @@ MODULE DevCPR;
   BEGIN
     s := scope;
     WHILE (s.next # NIL) & (s.next.name$ # name$) DO s := s.next END;
-    IF s.next = NIL THEN NEW(s.next); s.next.name := name$; s.next.val := val END
+    IF s.next = NIL THEN NEW(s.next) END;
+    s.next.name := name$; s.next.val := val
   END Set;
 
   PROCEDURE ^ Expression (VAR x: BOOLEAN);
 
   PROCEDURE Factor (VAR x: BOOLEAN);
-  BEGIN x := FALSE;
+  BEGIN
     IF sym = ident THEN
-      x := Old(name).val; Get(sym)
+      x := Old(name).val; Get(sym);
+    ELSIF sym = defined THEN
+      Get(sym);
+      IF sym = lpar THEN
+        Get(sym);
+        IF sym = ident THEN
+          x := Find(name) # NIL;
+          Get(sym)
+        ELSE err(48)
+        END;
+        IF sym # rpar THEN err(23)
+        ELSE Get(sym)
+        END
+      ELSE err(40)
+      END      
     ELSIF sym = lpar THEN
       Get(sym); Expression(x);
       IF sym # rpar THEN err(23)
@@ -133,6 +150,7 @@ MODULE DevCPR;
     ELSIF sym = not THEN
       Get(sym); Factor(x); x := ~x
     ELSE
+      x := FALSE;
       err(13)
     END
   END Factor;
@@ -177,6 +195,14 @@ MODULE DevCPR;
     IF top = NIL THEN err(51); fold := 0; If(TRUE) END
   END End;
 
+  PROCEDURE Printable* (): BOOLEAN;
+    VAR c: Context;
+  BEGIN
+    c := top;
+    WHILE (c # NIL) & c.val DO c := c.next END;
+    RETURN c = NIL
+  END Printable;
+
   PROCEDURE Parse*;
     VAR val: BOOLEAN;
   BEGIN
@@ -186,6 +212,8 @@ MODULE DevCPR;
       IF sym = ident THEN New(name, FALSE); Get(sym)
       ELSE err(48)
       END
+    ELSIF sym = error THEN
+      IF Printable() THEN err(501) END; Get(sym)
     ELSIF sym = ident THEN
       Get(sym);
       IF sym = plus THEN Old(name).val := TRUE; Get(sym)
@@ -215,14 +243,6 @@ MODULE DevCPR;
     IF sym # endcom THEN err(5) ELSE DevCPM.errpos := DevCPM.curpos - 1 END
   END Parse;
 
-  PROCEDURE Printable* (): BOOLEAN;
-    VAR c: Context;
-  BEGIN
-    c := top;
-    WHILE (c # NIL) & c.val DO c := c.next END;
-    RETURN c = NIL
-  END Printable;
-
   PROCEDURE Check*;
   BEGIN
     IF fold # 1 THEN err(14) END
@@ -235,6 +255,7 @@ MODULE DevCPR;
   END Close;
 
   PROCEDURE Init*;
+    VAR s: Selector;
   BEGIN
     Close;
     If(TRUE);