-- File: ScriptNode.mesa - last edit by
-- Karlton: 1-Sep-82 18:29:08
DIRECTORY
ScriptHash USING [Hash];
ScriptNode: DEFINITIONS =
BEGIN
Handle: TYPE = LONG POINTER TO Object;
Type: TYPE = {
placeHolder,
atom, boolean, expression, integer, node, quotedExpression, real, string,
vector, qualifiedID, choice, application, univApplication, colon, target,
source, links, localBind, globalBind, environment, dollar, percent};
Object: TYPE = RECORD [
SELECT type: Type FROM
placeHolder => NULL,
atom => [atom: ID],
dollar => [label: ID],
links => [label: ID],
source, target => [ids: QualifiedID],
percent => [ids: QualifiedID],
qualifiedID => [ids: QualifiedID], -- has no sons
boolean => [boolean: BOOLEAN],
expression => [expression: Operator], -- must have 1 or 2 sons
choice => NULL, -- must have exactly 3 sons
environment => NULL, -- must have exactly 2 sons
integer => [integer: LONG INTEGER],
node => [private, context: LONG POINTER ← NIL],
quotedExpression => NULL,
real => [real: REAL],
string => [string: String ← []],
vector => NULL,
application => [ids: QualifiedID ← NIL],
univApplication => [atom: ID],
globalBind => [lhs: QualifiedID ← NIL, univ: BOOLEAN ← FALSE],
-- value is in son node
localBind => [lhs: QualifiedID ← NIL] -- value is in son node
ENDCASE];
ID: TYPE = ScriptHash.Hash;
QualifiedID: TYPE = LONG POINTER TO QualifiedIDSequence;
QualifiedIDSequence: TYPE = RECORD [ids: SEQUENCE length: CARDINAL OF ID];
Operator: TYPE = {plus, minus, divide, multiply};
Eval: PROCEDURE [node: Handle] RETURNS [value: Object];
String: TYPE = RECORD [
allSet0: BOOLEAN ← TRUE,
allSimple: BOOLEAN ← TRUE,
string: REF TEXT ← NIL];
END. -- of ScriptNode