DIRECTORY AMTypes USING [TV], IO USING [STREAM], SymTab USING [Ref], Rope USING [ROPE]; ExprRead: CEDAR DEFINITIONS = BEGIN Error: ERROR [ec: ErrorCode, msg: Rope.ROPE]; ErrorCode: TYPE = {Null, -- never raised CouldNotEval, -- could not evaluate expression NoValue, -- expression didn't return a value Syntax, -- bad expression syntax FileError, -- could not read from file Missing, -- raised by the FetchXXX procs. BadType, -- raised by the FetchXXX procs. NotTVTable -- the passed SymTab had something other than a TV! }; Eval: PROC [expr: Rope.ROPE, symTab: SymTab.Ref] RETURNS [AMTypes.TV]; Assign: PROC [line: Rope.ROPE, symTab: SymTab.Ref]; ReadStream: PROC [stream: IO.STREAM] RETURNS [symTab: SymTab.Ref]; ReadFile: PROC [fileName: Rope.ROPE] RETURNS [symTab: SymTab.Ref]; CombineTabs: PROC [first, second: SymTab.Ref] RETURNS [SymTab.Ref]; FetchBool: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: BOOL]; FetchInt: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: INT]; FetchCardinal: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: CARDINAL]; FetchAtom: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: ATOM]; FetchRope: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: Rope.ROPE]; FetchRefAny: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: REF ANY]; FetchListOfBool: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: LIST OF BOOL]; FetchListOfInt: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: LIST OF INT]; FetchListOfCardinal: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: LIST OF CARDINAL]; FetchListOfAtom: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: LIST OF ATOM]; FetchListOfRope: PROC [params: SymTab.Ref, name: Rope.ROPE, missingOK: BOOL _ FALSE] RETURNS [found: BOOL, val: LIST OF Rope.ROPE]; StoreBool: PROC [params: SymTab.Ref, name: Rope.ROPE, val: BOOL]; StoreInt: PROC [params: SymTab.Ref, name: Rope.ROPE, val: INT]; StoreCardinal: PROC [params: SymTab.Ref, name: Rope.ROPE, val: CARDINAL]; StoreAtom: PROC [params: SymTab.Ref, name: Rope.ROPE, val: ATOM]; StoreRope: PROC [params: SymTab.Ref, name: Rope.ROPE, val: Rope.ROPE]; StoreRefAny: PROC [params: SymTab.Ref, name: Rope.ROPE, val: REF ANY]; END. àFile: ExprRead.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Created by: Mayo, July 23, 1984 3:50:47 pm PDT Last Edited by: Mayo, August 15, 1984 12:40:10 pm PDT -- ExprRead: Read expressions of the form 'var _ expr' or 'var ~ expr'. If the operator is '_ then the expr is evaluated using symbols in a symbol table, or things in the global naming context. See Interpreter.mesa for more details. If the operator is '~ then expr is simply treated as a rope which is then assigned to var. -- This module uses the slot named '&' in the passed symbol tables as a temporary placeholder. Anything that the caller places there might be destroyed. Evaluate one expression and return a TV for it's result. Evaluate one assignment statement of the form 'var _ expr', and update var in the symbol table. Read a file that contains one assignment statement per line, returning a symbol table Combine 2 tables of TVs to yield a third. Values in the second table override values in the first table if there is a conflict. Handy procs for looking up & storing parameters in a SymTab of TVs. These procs may raise Error[NotTVTable] and Error[FetchError]. IF we can't find the parameter AND missingOK is false THEN we raise Error[Missing] with a message like: "Parameter XYZ is missing." IF the parameter is not of the expected type then we raise Error[BadType] with a message like: "Parameter XYZ is of the wrong type, it should be a rope." -- Base types (add more if you wish!) Non-ref values are stored as refs to the value. (That is, INT is stored as REF INT) -- General hook for other types. -- lists (add more if you wish!) -- Base types & ref any. For other types, create a pointer to it and do StoreRefAny. Same for lists. ÊA˜šœ™Jšœ Ïmœ1™™>šžœžœžœ-™gJ™—šœ^™^J™:—J˜Jš z™zJš¡ œžœ!žœ žœžœžœ žœžœ˜pJš¡œžœ!žœ žœžœžœ žœžœ˜nJš¡ œžœ!žœ žœžœžœ žœžœ˜xJš¡ œžœ!žœ žœžœžœ žœžœ˜pJš¡ œžœ!žœ žœžœžœ žœ žœ˜uJ™ Jš¡ œžœ!žœ žœžœžœ žœžœžœ˜uJ˜J™ Jš¡œžœ!žœ žœžœžœ žœžœžœžœ˜~Jš¡œžœ!žœ žœžœžœ žœžœžœžœ˜|Jš¡œžœ!žœ žœžœžœ žœžœžœžœ˜†Jš¡œžœ!žœ žœžœžœ žœžœžœžœ˜~Jš¡œžœ!žœ žœžœžœ žœžœžœžœ˜ƒJ™Jšœf™fJš¡ œžœ!žœžœ˜AJš¡œžœ!žœžœ˜?Jš¡ œžœ!žœžœ˜IJš¡ œžœ!žœžœ˜AJš¡ œžœ!žœ žœ˜FJš ¡ œžœ!žœžœžœ˜FJ˜J˜Jšžœ˜—J˜J˜J˜—…— €¡