-- 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