-- file SakuraTree.Mesa
-- last modified by Satterthwaite, December 17, 1980  3:20 PM
-- last edit by Suzuki, 28-Dec-81  8:34:10

SakuraTree: DEFINITIONS =
  BEGIN

 -- data structures

  Link: TYPE = REF ANY;
  Null: Link = NIL;

  Node: TYPE = RECORD [
    name: NodeName,
    attr: PACKED ARRAY AttrId OF BOOLEAN ← ALL[FALSE],
    info: CARDINAL ← 0,
    son: SEQUENCE sonLimit: [1..MaxNSons] OF Link];

  MaxNSons: PRIVATE CARDINAL = LAST[INTEGER];
  SonId: TYPE = [1..MaxNSons);

  AttrId: TYPE = [1..3];

  Handle: TYPE = REF Node;
  NullHandle: Handle = NIL;

  NodeName: TYPE = {
   -- general tree constructors
    list, item,

   -- declarations
    decl, typedecl,
    basicTC, enumeratedTC, recordTC, monitoredTC, variantTC,
    refTC, pointerTC, listTC, arrayTC, arraydescTC, sequenceTC,
    procTC, processTC, portTC, signalTC, errorTC, programTC,
    anyTC, definitionTC, unionTC, relativeTC,
    subrangeTC, longTC, opaqueTC, zoneTC, linkTC, spareTC,
    implicitTC, frameTC, discrimTC,
    entry, internal,
    unit, diritem, module, body, inline, lambda, block,

   -- statements
    assign, extract,
    if,
    case, casetest, caseswitch,
    bind,
    do, forseq, upthru, downthru,
    return, result,
    goto, exit, loop,
    free,
    resume, reject, continue, retry, catchmark,
    restart, stop,
    lock, wait, notify, broadcast, unlock,
    null,
    label,
    open,
    enable, catch,
    dst, lst, lstf,
    syscall, spareS1, spareS2, spareS3,
    subst, call, portcall, signal, error, syserror, xerror,
    start, join,

   -- expressions
    apply,
    callx, portcallx, signalx, errorx, syserrorx, startx, fork, joinx,
    index, dindex, seqindex, reloc,
    construct, union, rowcons, sequence,
    substx,
    ifx, casex, bindx,
    assignx, extractx,
    or, and,
    relE, relN, relL, relGE, relG, relLE, in, notin,
    plus, minus, times, div, mod,
    dot, cdot, dollar,
    create,
    not,
    uminus,
    addr,
    uparrow,
    min, max, lengthen, abs, all,
    size, first, last, pred, succ,
    arraydesc, length, base,
    loophole,
    nil,
    new,
    void,
    clit, llit,
    cast, check, float, pad, chop, safen,
    syscallx, narrow, istype,
    openx,
    mwconst,
    atom, typecode,
    stringinit, textlit, signalinit, procinit,
    intOO, intOC, intCO, intCC,

    thread,
    none,

    exlist,
    initlist,
    ditem,

    self,
    mergecons,
    
    -- Sakura nodes
    connectorassign, connectorcreate, connectorfork, connectorjoin, componentcreate,
    compitem,
    deviceTC, deviceblock, devicehead, devicebody,
    transfer,
    parallel,
    guardedcommand,
    guardianblock,
    choice,
    on,
    when, whenloopup, whenloopdown, whenloopchange,
    whenup, whendown, whenchange,
    event,
    upsignal, downsignal, changesignal,
    circuit,
    alias, control, mossim, step};
    
 -- tree manipulation

  Id: TYPE = Link;

  Scan: TYPE = PROC [t: Link];
  Map: TYPE = PROC [t: Link] RETURNS [v: Link];
  Test: TYPE = PROC [t: Link] RETURNS [BOOLEAN];

  END.