DIRECTORY ExprRead, FS, IO, Rope, SymTab; ExprReadImpl: CEDAR PROGRAM IMPORTS FS, IO, Rope, SymTab EXPORTS ExprRead = BEGIN OPEN ExprRead; ReadFile: PUBLIC PROC [fileName: Rope.ROPE] RETURNS [tab: SymTab.Ref _ SymTab.Create[]] ~ { ENABLE { IO.EndOfStream => GOTO done; IO.Error => GOTO done; }; stream: FS.STREAM _ FS.StreamOpen[fileName, $read]; tokenKind: IO.TokenKind; key, value, gets, semi: Rope.ROPE; [tokenKind, key, ] _ IO.GetCedarTokenRope[stream]; WHILE tokenKind # tokenERROR DO --AND tokenKind # tokenEOF DO [tokenKind, gets, ] _ IO.GetCedarTokenRope[stream]; IF tokenKind # tokenSINGLE AND ~Rope.Equal[gets, "_"] THEN Error[Rope.Cat["Expecting _, got: ", gets]]; -- [tokenKind, value, ] _ IO.GetCedarTokenRope[stream]; value _ IO.GetRopeLiteral[stream]; IF tokenKind = tokenERROR OR tokenKind = tokenEOF THEN Error["Unexpected end of file"]; [] _ SymTab.Store[tab, key, value]; [tokenKind, semi, ] _ IO.GetCedarTokenRope[stream]; IF ~tokenKind # tokenSINGLE AND Rope.Equal[gets, ";"] THEN Error[Rope.Cat["Expecting ;, got: ", semi]]; [tokenKind, key, ] _ IO.GetCedarTokenRope[stream]; ENDLOOP; EXITS done => NULL; }; FetchRope: PUBLIC PROC [tab: SymTab.Ref, key: Rope.ROPE, missingOK: BOOLEAN] RETURNS [found: BOOLEAN, val: Rope.ROPE] ~ { ref: REF; [found, ref] _ SymTab.Fetch[tab, key]; IF ~missingOK AND ~found THEN Error[Rope.Cat["No value for token: ", key, "on fetch"]]; IF found THEN val _ NARROW[ref]; }; FetchBool: PUBLIC PROC [tab: SymTab.Ref, key: Rope.ROPE, missingOK: BOOLEAN] RETURNS [found: BOOLEAN, val: BOOLEAN] ~ { ref: REF; [found, ref] _ SymTab.Fetch[tab, key]; IF ~missingOK AND ~found THEN Error[Rope.Cat["No value for token: ", key, "on fetch"]]; IF found THEN { ropeValue: Rope.ROPE; ropeValue _ NARROW[ref]; IF Rope.Equal[ropeValue, "TRUE"] THEN val _ TRUE ELSE IF Rope.Equal[ropeValue, "FALSE"] THEN val _ FALSE ELSE Error[Rope.Cat["Invalid value for: ", key, "was", ropeValue]]; }; }; Error: PUBLIC ERROR [msg: Rope.ROPE _ NIL] = CODE; END. --File: ExprReadImpl.mesa Last Edited by: Preas, August 2, 1986 7:46:50 pm PDT read the data file and put entries in symbol table -- IF tokenKind = tokenSINGLE AND Rope.Equal[key, "."] THEN tokenKind _ tokenEOF; get a ROPE entry get a BOOLEAN entry Κ˜Jšœ™J™4J˜šΟk ˜ Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—J˜J˜šΟn œœ˜Jšœœœ˜Jšœ  œ˜'J˜š žœœœœœ(˜[Jšœ2™2codešœ˜Kšœœ˜Kšœ œ˜Kšœ˜—Kšœœœœ˜3Kšœ œ ˜Kšœœ˜"Jšœœ˜2šœœΟc˜=Kšœœ˜3šœœ˜:Kšœ,˜,—Kšœœ˜7Kšœœ˜"šœœœ˜7K˜ —Kšœ#˜#Kšœœ˜3šœœ˜:Kšœ,˜,—Kšœœ˜2Kšœ2œ™QKšœ˜—š˜Kšœœ˜ —J˜J˜—šž œœœœ œœ œ œ˜yJ™Kšœœ˜ Kšœ&˜&Kšœ œœ:˜WKšœœœ˜ J˜J˜—šž œœœœ œœ œœ˜wJšœœ™Kšœœ˜ Kšœ&˜&Kšœ œœ:˜Wšœœ˜Kšœœ˜Kšœ œ˜Kšœœ˜0Kšœœ œ˜7Kšœ?˜CKšœ˜——˜J˜J˜—Jš Πbnœœœ œœœ˜2Jšœ˜——…—Ζ Ϋ