<> <> <> DIRECTORY ParserTypeDefs, ParserUtilityDefs, ParserInputDefs; ParserUtilities: CEDAR PROGRAM IMPORTS ParserInputDefs, ParserTypeDefs EXPORTS ParserUtilityDefs = BEGIN OPEN ParserUtilityDefs; RecoverFromError: PUBLIC ERROR [errorCode: PossibleError] = CODE; InitUtilities: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN RETURN [TRUE]; END; FinishUtilities: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN RETURN [TRUE]; END; Blank: PUBLIC PROCEDURE = BEGIN WHILE TRUE DO SELECT ParserInputDefs.Peek[] FROM '(,'),';,'-,ParserInputDefs.EOF,IN ['0..'9],IN ['A..'Z] => RETURN; ENDCASE => [] _ ParserInputDefs.GetChar[]; ENDLOOP; END; Sep: PUBLIC PROCEDURE = BEGIN WHILE TRUE DO SELECT ParserInputDefs.Peek[] FROM '(,'),';,'-,ParserInputDefs.EOF,IN ['0..'9] => RETURN; ENDCASE => [] _ ParserInputDefs.GetChar[]; ENDLOOP; END; Semi: PUBLIC PROCEDURE RETURNS [BOOLEAN] = BEGIN answer: BOOLEAN _ FALSE; Blank[]; IF ParserInputDefs.Peek[] = '; THEN BEGIN [] _ ParserInputDefs.GetChar[]; answer _ TRUE; Blank[]; END; RETURN[answer]; END; GetPath: PUBLIC PROCEDURE [a: ParserTypeDefs.Path] = BEGIN temp: CHARACTER; Sep[]; WHILE (temp _ ParserInputDefs.Peek[]) IN ['0..'9] OR temp = '- DO ParserTypeDefs.AppendPoint[a,GetPoint[]]; Sep[]; ENDLOOP; IF ParserTypeDefs.PathLength[a] = 0 THEN ERROR RecoverFromError[NullPath]; END; Unsigned: PUBLIC PROCEDURE RETURNS [CARDINAL] = BEGIN someDigit: BOOLEAN _ FALSE; ans: CARDINAL _ 0; BigNum: CARDINAL = (LAST[CARDINAL]-9)/10; Sep[]; WHILE (ans < BigNum) AND ParserInputDefs.Peek[] IN ['0..'9] DO ans _ ans * 10 + (ParserInputDefs.GetChar[]-'0); someDigit _ TRUE; ENDLOOP; IF ~someDigit THEN ERROR RecoverFromError[MissingUnsigned]; IF ParserInputDefs.Peek[] IN ['0..'9] THEN ERROR RecoverFromError[NumberTooBig] ELSE RETURN[ans]; END; UnsignedLong: PUBLIC PROCEDURE RETURNS [LONG CARDINAL] = BEGIN someDigit: BOOLEAN _ FALSE; ans: LONG CARDINAL _ 0; BigNum: LONG CARDINAL = (LAST[LONG CARDINAL]-9)/10; Sep[]; WHILE (ans < BigNum) AND ParserInputDefs.Peek[] IN ['0..'9] DO ans _ ans * 10 + (ParserInputDefs.GetChar[]-'0); someDigit _ TRUE; ENDLOOP; IF ~someDigit THEN ERROR RecoverFromError[MissingUnsigned]; IF ParserInputDefs.Peek[] IN ['0..'9] THEN ERROR RecoverFromError[NumberTooBig] ELSE RETURN[ans]; END; Signed: PUBLIC PROCEDURE RETURNS [INTEGER] = BEGIN sign, someDigit: BOOLEAN _ FALSE; ans: INTEGER _ 0; BigNum: INTEGER = (LAST[INTEGER]-9)/10; Sep[]; IF ParserInputDefs.Peek[] = '- THEN BEGIN sign _ TRUE; [] _ ParserInputDefs.GetChar[]; END; WHILE (ans < BigNum) AND ParserInputDefs.Peek[] IN ['0..'9] DO ans _ ans * 10 + (ParserInputDefs.GetChar[]-'0); someDigit _ TRUE; ENDLOOP; IF ~someDigit THEN ERROR RecoverFromError[MissingSigned]; IF ParserInputDefs.Peek[] IN ['0..'9] THEN ERROR RecoverFromError[NumberTooBig] ELSE RETURN[IF sign THEN -ans ELSE ans]; END; SignedLong: PUBLIC PROCEDURE RETURNS [INT] = BEGIN sign, someDigit: BOOLEAN _ FALSE; ans: INT _ 0; BigNum: INT = (LAST[INT]-9)/10; Sep[]; IF ParserInputDefs.Peek[] = '- THEN BEGIN sign _ TRUE; [] _ ParserInputDefs.GetChar[]; END; WHILE (ans < BigNum) AND ParserInputDefs.Peek[] IN ['0..'9] DO ans _ ans * 10 + (ParserInputDefs.GetChar[]-'0); someDigit _ TRUE; ENDLOOP; IF ~someDigit THEN ERROR RecoverFromError[MissingSigned]; IF ParserInputDefs.Peek[] IN ['0..'9] THEN ERROR RecoverFromError[NumberTooBig] ELSE RETURN[IF sign THEN -ans ELSE ans]; END; GetPoint: PUBLIC PROCEDURE RETURNS [ParserTypeDefs.Point] = BEGIN ans: ParserTypeDefs.Point; ans.x _ SignedLong[]; ans.y _ SignedLong[]; RETURN[ans]; END; END.