From: Michael D. Lowis Date: Wed, 21 Apr 2021 20:25:41 +0000 (-0400) Subject: reformatted OSP.mod for readability. Started building parser rules for statements... X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=018c0d2a33b414b500cd338e12e917baa87ba03e;p=proto%2Fobnc.git reformatted OSP.mod for readability. Started building parser rules for statements. Focusing on if statements, assignments, and function calls first --- diff --git a/cerise/oberon0/OSP.Mod b/cerise/oberon0/OSP.Mod index 58be0a2..4433549 100644 --- a/cerise/oberon0/OSP.Mod +++ b/cerise/oberon0/OSP.Mod @@ -284,62 +284,123 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) PROCEDURE StatSequence; VAR par, obj: OSG.Object; x, y: OSG.Item; n, L: LONGINT; BEGIN (* StatSequence *) - REPEAT (*sync*) obj := NIL; + REPEAT (*sync*) + obj := NIL; IF ~((sym = OSS.ident) OR (sym >= OSS.if) & (sym <= OSS.repeat) OR (sym >= OSS.semicolon)) THEN OSS.Mark("statement expected"); REPEAT OSS.Get(sym) UNTIL (sym = OSS.ident) OR (sym >= OSS.if) END ; + IF sym = OSS.ident THEN - find(obj); OSS.Get(sym); - IF obj.class = OSG.SProc THEN StandProc(obj.val) - ELSE OSG.MakeItem(x, obj, level); selector(x); + find(obj); + OSS.Get(sym); + IF obj.class = OSG.SProc THEN + StandProc(obj.val) + ELSE + OSG.MakeItem(x, obj, level); + selector(x); IF sym = OSS.becomes THEN (*assignment*) - OSS.Get(sym); expression(y); - IF (x.type.form IN {OSG.Boolean, OSG.Integer}) & (x.type.form = y.type.form) THEN OSG.Store(x, y) - ELSE OSS.Mark("incompatible assignment") + OSS.Get(sym); + expression(y); + IF (x.type.form IN {OSG.Boolean, OSG.Integer}) & (x.type.form = y.type.form) THEN + OSG.Store(x, y) + ELSE + OSS.Mark("incompatible assignment") END - ELSIF sym = OSS.eql THEN OSS.Mark("should be :="); OSS.Get(sym); expression(y) + ELSIF sym = OSS.eql THEN + OSS.Mark("should be :="); + OSS.Get(sym); + expression(y) ELSIF sym = OSS.lparen THEN (*procedure call*) OSS.Get(sym); - IF (obj.class = OSG.Proc) & (obj.type = NIL) THEN ParamList(obj); OSG.Call(obj); - ELSE OSS.Mark("not a procedure") + IF (obj.class = OSG.Proc) & (obj.type = NIL) THEN + ParamList(obj); + OSG.Call(obj); + ELSE + OSS.Mark("not a procedure") END ELSIF obj.class = OSG.Proc THEN (*procedure call without parameters*) - IF obj.nofpar > 0 THEN OSS.Mark("missing parameters") END ; - IF obj.type = NIL THEN OSG.Call(obj) ELSE OSS.Mark("not a procedure") END - ELSIF (obj.class = OSG.SProc) & (obj.val = 3) THEN OSG.WriteLn - ELSIF obj.class = OSG.Typ THEN OSS.Mark("illegal assignment") - ELSE OSS.Mark("not a procedure") + IF obj.nofpar > 0 THEN + OSS.Mark("missing parameters") + END ; + IF obj.type = NIL THEN + OSG.Call(obj) ELSE + OSS.Mark("not a procedure") + END + ELSIF (obj.class = OSG.SProc) & (obj.val = 3) THEN + OSG.WriteLn + ELSIF obj.class = OSG.Typ THEN + OSS.Mark("illegal assignment") + ELSE + OSS.Mark("not a procedure") END END ELSIF sym = OSS.if THEN - OSS.Get(sym); expression(x); CheckBool(x); OSG.CFJump(x); Check(OSS.then, "no THEN"); - StatSequence; L := 0; + OSS.Get(sym); + expression(x); + CheckBool(x); + OSG.CFJump(x); + Check(OSS.then, "no THEN"); + StatSequence; + L := 0; WHILE sym = OSS.elsif DO - OSS.Get(sym); OSG.FJump(L); OSG.FixLink(x.a); expression(x); CheckBool(x); OSG.CFJump(x); - IF sym = OSS.then THEN OSS.Get(sym) ELSE OSS.Mark("THEN?") END ; + OSS.Get(sym); + OSG.FJump(L); + OSG.FixLink(x.a); + expression(x); + CheckBool(x); + OSG.CFJump(x); + IF sym = OSS.then THEN + OSS.Get(sym) + ELSE + OSS.Mark("THEN?") + END ; StatSequence END ; IF sym = OSS.else THEN - OSS.Get(sym); OSG.FJump(L); OSG.FixLink(x.a); StatSequence - ELSE OSG.FixLink(x.a) + OSS.Get(sym); + OSG.FJump(L); + OSG.FixLink(x.a); + StatSequence + ELSE + OSG.FixLink(x.a) END ; OSG.FixLink(L); - IF sym = OSS.end THEN OSS.Get(sym) ELSE OSS.Mark("END?") END + IF sym = OSS.end THEN + OSS.Get(sym) + ELSE + OSS.Mark("END?") + END ELSIF sym = OSS.while THEN - OSS.Get(sym); L := OSG.pc; expression(x); CheckBool(x); OSG.CFJump(x); - Check(OSS.do, "no DO"); StatSequence; OSG.BJump(L); OSG.FixLink(x.a); + OSS.Get(sym); + L := OSG.pc; + expression(x); + CheckBool(x); + OSG.CFJump(x); + Check(OSS.do, "no DO"); + StatSequence; + OSG.BJump(L); + OSG.FixLink(x.a); Check(OSS.end, "no END") ELSIF sym = OSS.repeat THEN - OSS.Get(sym); L := OSG.pc; StatSequence; + OSS.Get(sym); + L := OSG.pc; + StatSequence; IF sym = OSS.until THEN - OSS.Get(sym); expression(x); CheckBool(x); OSG.CBJump(x, L) - ELSE OSS.Mark("missing UNTIL"); OSS.Get(sym) + OSS.Get(sym); + expression(x); + CheckBool(x); + OSG.CBJump(x, L) + ELSE + OSS.Mark("missing UNTIL"); + OSS.Get(sym) END END ; OSG.CheckRegs; - IF sym = OSS.semicolon THEN OSS.Get(sym) - ELSIF sym < OSS.semicolon THEN OSS.Mark("missing semicolon?") + IF sym = OSS.semicolon THEN + OSS.Get(sym) + ELSIF sym < OSS.semicolon THEN + OSS.Mark("missing semicolon?") END UNTIL sym > OSS.semicolon END StatSequence; @@ -518,6 +579,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) Check(OSS.semicolon, "; expected"); Declarations(dc); WHILE sym = OSS.procedure DO ProcedureDecl; Check(OSS.semicolon, "; expected") END ; + OSG.Header(dc); IF sym = OSS.begin THEN OSS.Get(sym); StatSequence END ; Check(OSS.end, "no END"); diff --git a/cerise/parser.c b/cerise/parser.c index e166ccb..d3ca8f9 100644 --- a/cerise/parser.c +++ b/cerise/parser.c @@ -471,7 +471,26 @@ RULE(const_decl) RULE(statement_seq) { - (void)p, (void)item; + (void)item; + if (matches(p, IDENT)) + { + if (accept(p, '=')) + { + + } + else + { + error(p, "expected assignment"); + } + } + else if (matches(p, IF)) + { + } + else + { + error(p, "expected a statement"); + } + expect(p, ';'); } RULE(declaration_seq) @@ -481,16 +500,20 @@ RULE(declaration_seq) const_decl(p, item); expect(p, ';'); } + if (accept(p, TYPE)) { type_decl(p, item); expect(p, ';'); } + if (accept(p, VAR)) { var_decl(p, item); expect(p, ';'); } + + /* WHILE sym = OSS.procedure DO ProcedureDecl; Check(OSS.semicolon, "; expected") END ; */ } RULE(import_list)