<> <> <> <<>> DIRECTORY Rope USING [ROPE]; RobotEvaluator: CEDAR DEFINITIONS ~ { UnOp: TYPE ~ REF UnOpRec; BinOp: TYPE ~ REF BinOpRec; TrinOp: TYPE ~ REF TrinOpRec; UnOpRec: PUBLIC TYPE ~ PROC [a: INTEGER] RETURNS [z: INTEGER]; BinOpRec: PUBLIC TYPE ~ PROC [a,b: INTEGER] RETURNS [z: INTEGER]; TrinOpRec: PUBLIC TYPE ~ PROC [a,b,c: INTEGER] RETURNS [z: INTEGER]; Value: TYPE ~ REF ValueRec; ValueRec: PUBLIC TYPE ~ RECORD [ type: ValueType _ unassigned, value: INTEGER _ 0, --Only used if type=integer, or type=symbolRef fcn: REF ANY _ NIL, --Only used if type IN {unExp, binExp, trinExp} a,b,c: Value _ NIL --Only used if type IN {unExp, binExp, trinExp} ]; ValueType: TYPE ~ {unassigned, symbolRef, integer, unExp, binExp, trinExp}; Symbol: TYPE ~ REF SymbolRec; SymbolRec: TYPE ~ RECORD [ name: Rope.ROPE, --The text in the robot file value: Value --What it equals ]; MaxSymbolIndex: PRIVATE INT ~ 1499; --Should be `fairly' prime Index: TYPE ~ [0..MaxSymbolIndex); --An index into a symbol table SymbolTable: TYPE ~ REF SymbolTableRec; SymbolTableRec: TYPE ~ ARRAY Index OF Symbol; opIfThenElse: TrinOp; opOR, opAND, opMOD, opLT, opEQ, opGT, opNE, opGE, opLE, opPlus, opMinus, opTimes, opDivide: BinOp; opNOT, opUMinus: UnOp; ApplyUnaryFcn: PROC [fcn: UnOp, a: Value] RETURNS [z: Value]; <> ApplyBinaryFcn: PROC [fcn: BinOp, a,b: Value] RETURNS [z: Value]; <> ApplyTrinaryFcn: PROC [fcn: TrinOp, a,b,c: Value] RETURNS [z: Value]; <> Eval: PROC [value: Value, s: SymbolTable _ NIL] RETURNS [z: Value]; <> <<>> NewUnassignedValue: PROC RETURNS [z: Value]; <> <<>> NewValueFromInteger: PROC [a: INTEGER] RETURNS [z: Value]; <> NewSymbolTable: PROC RETURNS [s: SymbolTable]; RopeToSymbolIndex: PROC [r: Rope.ROPE, s: SymbolTable] RETURNS [index: Index]; <> <<>> NextIndex: PROC [in: Index] RETURNS [out: Index] ~ INLINE <> {RETURN[IF in=0 THEN MaxSymbolIndex-1 ELSE in-1]}; ValueOfSymbol: PROC [index: Index, s: SymbolTable _ NIL] RETURNS [v: Value] ~ INLINE { RETURN [ Eval[NEW[ValueRec _ [type: symbolRef, value: index]], s] ]; }; AssignValueToSymbol: PROC [v: Value, index: Index, s: SymbolTable] ~ INLINE { IF s[index]=NIL THEN ERROR ELSE s[index].value _ v; }; ResolveSymbolTable: PROC [s: SymbolTable] RETURNS [unresolved: BOOLEAN]; }.