X-Git-Url: https://deadsoftware.ru/gitweb?p=cpc.git;a=blobdiff_plain;f=src%2Fgeneric%2FDev%2FMod%2FCPR.cp;h=03c3fe40dc5605797ee685f63cffa3b39de739e0;hp=233b12166f49d168784e965a08de086fcda5069f;hb=6f35998ea70a845e762ec234aa097d1fe414ecf3;hpb=47136c23919fb14957c4c59240bbc756f56d1942 diff --git a/src/generic/Dev/Mod/CPR.cp b/src/generic/Dev/Mod/CPR.cp index 233b121..03c3fe4 100644 --- a/src/generic/Dev/Mod/CPR.cp +++ b/src/generic/Dev/Mod/CPR.cp @@ -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,30 +66,33 @@ 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 END END Get; - PROCEDURE New (IN name: DevCPT.Name; val: BOOLEAN); + PROCEDURE New (IN name: DevCPT.Name; val: BOOLEAN): Selector; VAR s: Selector; 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 ELSE err(1) - END + END; + RETURN s.next END New; PROCEDURE Old (IN name: DevCPT.Name): Selector; @@ -116,15 +119,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 +151,7 @@ MODULE DevCPR; ELSIF sym = not THEN Get(sym); Factor(x); x := ~x ELSE + x := FALSE; err(13) END END Factor; @@ -177,15 +196,28 @@ 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; + VAR val: BOOLEAN; s: Selector; BEGIN Get(sym); IF sym = new THEN Get(sym); - IF sym = ident THEN New(name, FALSE); Get(sym) + IF sym = ident THEN s := New(name, FALSE); Get(sym) ELSE err(48) + END; + IF (sym = plus) OR (sym = minus) THEN + s.val := sym = plus; Get(sym) 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 +247,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,12 +259,13 @@ MODULE DevCPR; END Close; PROCEDURE Init*; + VAR s: Selector; BEGIN Close; If(TRUE); NEW(scope); - New("TRUE", TRUE); - New("FALSE", FALSE) + Set("TRUE", TRUE); + Set("FALSE", FALSE) END Init; END DevCPR.