Copyright (C) 1992, Digital Equipment Corporation                         
 All rights reserved.                                                      
 See the file COPYRIGHT for a full description.                            
                                                                           
 Last modified on Wed Jun  8 17:23:14 PDT 1994 by heydon                   
      modified on Fri Aug  7 21:53:59 PDT 1992 by myers                    
INTERFACE JunoToken;
 A JunoToken.T represents one of the possible input tokens of the Juno
   language. Juno has 8 token classes: literal real numbers, literal texts,
   identifiers, operators, keywords, reserved identifiers, comments, and an
   end-of-stream marker. This procedure also provides the procedure ToText()
   for converting a token to a textual form. 
IMPORT JunoValue;
TYPE
  Kind =
    { LitReal, LitText, Id,
      Semi, Dot, Comma, Colon, LPren, RPren, LBrace, RBrace, LBracket,
        RBracket, Assign, SuchThat, Else, Guard, Near, Equals, Differs, Less,
        Greater, AtMost, AtLeast, Plus, Minus, Times, Divide, Concat,
      Module, Private, End, Import, Const, Var, Pred, Func, Proc, UI, Is,
        Skip, Abort, If, Fi, Do, Od, Save, In, Nil, True, False, Or, And, Not,
        Exists, Cong, Para, Hor, Ver, Rel, Div, Mod,
      Real, Text, Pair, Int, Floor, Ceiling, Round, Abs, Sin, Cos, Ln,
        Exp, Car, Cdr, Max, Min, Atan,
      Comment, EndMarker, Unknown };
  Op = [Kind.Semi..Kind.Concat];	 (* operators *)
  KeyWd = [Kind.Module..Kind.Mod];	 (* keywords *)
  ResvdId = [Kind.Real..Kind.Atan];	 (* reserved identifiers *)
CONST
  AllOps = SET OF Kind{FIRST(Op)..LAST(Op)};
  AllKeyWds = SET OF Kind{FIRST(KeyWd)..LAST(KeyWd)};
  AllResvdIds = SET OF Kind{FIRST(ResvdId)..LAST(ResvdId)};
TYPE
  T = REF RECORD
    kind: Kind;				 (* kind of token *)
    text: TEXT;				 (* text of the token *)
    val: REFANY;			 (* TEXT or Atom.T *)
    num: JunoValue.Real;                 (* for real values *)
  END;
 A token t has a kind and an optional value. The value t.val is
   meaningful if and only if t.kind is Kind.LitText, Kind.Id, or
   Kind.Comment. The value t.num is meaningful if and only if t.kind
   is Kind.LitReal. There are 8 token classes: literal reals,
   literal texts, identifiers, operators, keywords, reserved identifiers,
   comments, and end-of-stream. A token t is classified according to the
   following table:
      
         Class           Condition               Value Type
         literal real    t.kind = Kind.LitReal   t.num is a JunoValue.Real
         literal text    t.kind = Kind.LitText   t.val is a TEXT
         identifier      t.kind = Kind.Id        t.val is an Atom.T
         operator        t.kind IN AllOps
         keyword         t.kind IN AllKeyWds
         reserved id     t.kind IN AllResvdIds
         comment         t.kind = Kind.Comment   t.val is a TEXT
         end-of-stream   t.kind = Kind.EndMarker
      
   
The TEXT associated with a text literal does not include the start and end
   double-quote characters, and escape sequences in the input literal have
   been converted to ASCII characters in the result text. The TEXT associated
   with a comment *does* include the begin- and end-of-comment characters, as
   well as those of any nested comments. 
PROCEDURE Copy(t: T): T;
 Returns a new token with the same field values as t. 
PROCEDURE ToName(t: T): TEXT;
 Produces a human-readable representation of the token t as a TEXT. This
   representation has the form: kind(value), where kind is one of the
   strings Real, Text, Id, Op, KeyWd, ResvdId, or EndMarker, and
   value is the token value. When kind is Op, KeyWd, or ResvdId, the
   value printed is the implicit value of the operator, keyword, or reserved
   identifier, respectively, such as :=, IMPORT, or FLOOR. When kind
   is EndMarker, no value is printed. 
PROCEDURE ToText(t: T): TEXT;
 Produces a textual representation of the token t. If substituted for the
   text of the token actually found in the program, this representation will
   not change the program's meaning. 
CONST
  KindName = ARRAY Kind OF TEXT {
    "numeric literal", "text literal", "identifier",
    "semicolon", "period", "comma", "colon", "left parenthesis",
      "right parenthesis", "left brace", "right brace",	"left bracket",
      "right bracket", ":=", "::", "|", "->", "~", "=", "#", "<", ">",
      "<=", ">=", "+", "-", "*", "/", "&",
    "MODULE", "PRIVATE", "END", "IMPORT", "CONST", "VAR",
      "PRED", "FUNC", "PROC", "UI", "IS", "SKIP", "ABORT", "IF", "FI",
      "DO", "OD", "SAVE", "IN", "NIL", "TRUE", "FALSE", "OR", "AND", "NOT",
      "EXISTS", "CONG", "PARA", "HOR", "VER", "REL", "DIV", "MOD",
    "REAL", "TEXT", "PAIR", "INT", "FLOOR", "CEILING", "ROUND", "ABS", "SIN",
      "COS", "LN", "EXP", "CAR", "CDR", "MAX", "MIN", "ATAN",
    "comment", "end of file", "unknown token" };
END JunoToken.