%!
%% Copyright (C) 1989, Digital Equipment Corporation
%% All rights reserved.
%% See the file COPYRIGHT for a full description.
%%
%%Title:         m3tokens.txt
%%Creator:       Bill Kalsow
%%CreationDate:  Fri Oct 23 13:21:27 1987 by kalsow
%%EditDate:      Last modified on Fri Oct  4 18:50:20 1991 by kalsow
%%EditDate:           modified on Tue Jul  3 20:08:45 1990 by muller

%%
%%  railroad diagrams for Modula-3's lexical tokens
%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% railroad primitives

/SCALE 7.7 def  % sizing parameter
#include "railroad.h"

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

500 dict begin % local Modula-3 dictionary

%
% terminals
%

/zA  {(A) :TERM} def
/zB  {(B) :TERM} def
/zC  {(C) :TERM} def
/zD  {(D) :TERM} def
/zE  {(E) :TERM} def
/zF  {(F) :TERM} def
/zG  {(G) :TERM} def
/zH  {(H) :TERM} def
/zI  {(I) :TERM} def
/zJ  {(J) :TERM} def
/zK  {(K) :TERM} def
/zL  {(L) :TERM} def
/zM  {(M) :TERM} def
/zN  {(N) :TERM} def
/zO  {(O) :TERM} def
/zP  {(P) :TERM} def
/zQ  {(Q) :TERM} def
/zR  {(R) :TERM} def
/zS  {(S) :TERM} def
/zT  {(T) :TERM} def
/zU  {(U) :TERM} def
/zV  {(V) :TERM} def
/zW  {(W) :TERM} def
/zX  {(X) :TERM} def
/zY  {(Y) :TERM} def
/zZ  {(Z) :TERM} def

/za  {(a) :TERM} def
/zb  {(b) :TERM} def
/zc  {(c) :TERM} def
/zd  {(d) :TERM} def
/ze  {(e) :TERM} def
/zf  {(f) :TERM} def
/zg  {(g) :TERM} def
/zh  {(h) :TERM} def
/zi  {(i) :TERM} def
/zj  {(j) :TERM} def
/zk  {(k) :TERM} def
/zl  {(l) :TERM} def
/zm  {(m) :TERM} def
/zn  {(n) :TERM} def
/zo  {(o) :TERM} def
/zp  {(p) :TERM} def
/zq  {(q) :TERM} def
/zr  {(r) :TERM} def
/zs  {(s) :TERM} def
/zt  {(t) :TERM} def
/zu  {(u) :TERM} def
/zv  {(v) :TERM} def
/zw  {(w) :TERM} def
/zx  {(x) :TERM} def
/zy  {(y) :TERM} def
/zz  {(z) :TERM} def

/z0  {(0) :TERM} def
/z1  {(1) :TERM} def
/z2  {(2) :TERM} def
/z3  {(3) :TERM} def
/z4  {(4) :TERM} def
/z5  {(5) :TERM} def
/z6  {(6) :TERM} def
/z7  {(7) :TERM} def
/z8  {(8) :TERM} def
/z9  {(9) :TERM} def

/SEMI     { (;)  :TERM } def
/DOT      { (.)  :TERM } def
/EQ       { (=)  :TERM } def
/COLON    { (:)  :TERM } def
/NE       { (#)  :TERM } def
/LPAREN   { (\() :TERM } def
/RPAREN   { (\)) :TERM } def
/BAR      { (|)  :TERM } def
/ARROW    { (^)  :TERM } def
/STAR     { (*)  :TERM } def
/PLUS     { (+)  :TERM } def
/COMMA    { (,)  :TERM } def
/MINUS    { (-)  :TERM } def
/SLASH    { (/)  :TERM } def
/LT       { (<)  :TERM } def
/LBRACK   { ([)  :TERM } def
/RBRACK   { (])  :TERM } def
/LBRACE   { ({)  :TERM } def
/RBRACE   { (})  :TERM } def
/GT       { (>)  :TERM } def
/CONCAT   { (&)  :TERM } def
/SQUOTE   { (')  :TERM } def
/DQUOTE   { (")  :TERM } def
/BSLASH   { (\\)  :TERM } def
/SHRIEK   { (!)  :TERM } def
/DOLLARS  { ($)  :TERM } def
/PERCENT  { (\045) :TERM } def
/QUESTION { (?)  :TERM } def
/ATT      { (@)  :TERM } def
/UNDERBAR { (_)  :TERM } def
/BQUOTE   { (`)  :TERM } def
/TILDE    { (~)  :TERM } def

/SPACE   { (' ')  :TERM } def
/HTAB    { ('\\t') :TERM } def
/LFEED   { ('\\n') :TERM } def
/CRETURN { ('\\r') :TERM } def
/FFEED   { ('\\f') :TERM } def
/BSPACE  { ('\\b') :TERM } def

/ISOChar { (any char with ISO-Latin-1 code in [160..255]) {} :NONTERM } def

/Extended {
    (extended character)
    { ISOChar }
    :NONTERM
  } def

/Special {
    (special)
    {
      CHOICE:
        HCHOICE:
          SPACE SHRIEK NE DOLLARS PERCENT CONCAT LPAREN RPAREN STAR
            :HCHOICE
        HCHOICE:
          PLUS COMMA MINUS DOT SLASH COLON SEMI LT EQ
            :HCHOICE
        HCHOICE:
          GT QUESTION ATT LBRACK RBRACK ARROW UNDERBAR BQUOTE
            :HCHOICE
	HCHOICE:
          LBRACE BAR RBRACE TILDE Extended
            :HCHOICE 
      :CHOICE
    }
    :NONTERM
  } def

/Space {
    (white space)
    { HCHOICE: SPACE HTAB LFEED CRETURN FFEED :HCHOICE }
    :NONTERM
  } def

/OctalDigit {
    (octal digit)
    { HCHOICE: z0 z1 z2 z3 z4 z5 z6 z7 :HCHOICE }
    :NONTERM
  } def

/Digit {
    (digit)
    { HCHOICE: z0 z1 z2 z3 z4 z5 z6 z7 z8 z9 :HCHOICE }
    :NONTERM
  } def

/HexDigit {
    (hex digit)
    {
      CHOICE:
        Digit
	HCHOICE: zA zB zC zD zE zF :HCHOICE 
        HCHOICE: za zb zc zd ze zf :HCHOICE 
      :CHOICE
    }
    :NONTERM
  } def

/Letter {
    (letter)
    {
      CHOICE:
        HCHOICE: zA zB zC zD zE zF zG zH zI :HCHOICE
	HCHOICE: zJ zK zL zM zN zO zP zQ zR :HCHOICE
	HCHOICE: zS zT zU zV zW zX zY zZ    :HCHOICE
	HCHOICE: za zb zc zd ze zf zg zh zi :HCHOICE
	HCHOICE: zj zk zl zm zn zo zp zq zr :HCHOICE
	HCHOICE: zs zt zu zv zw zx zy zz    :HCHOICE
      :CHOICE
    }
    :NONTERM
  } def

/Character {
    (character)
    { HCHOICE: Letter Digit Special :HCHOICE }
    :NONTERM
  } def

/AnyCharacter {
    (any character)
    { HCHOICE: Character Space BSLASH SQUOTE DQUOTE :HCHOICE }
    :NONTERM
  } def

/Exponent {
    (exponent)
    { HCHOICE: ze zE zd zD zx zX :HCHOICE
      CHOICE: :EPSILON: PLUS MINUS :CHOICE
      LOOP: Digit :LOOP
    }
    :NONTERM
  } def

/Number {
    (number)
    {
      CHOICE:
        SEQ:
	  LOOP: Digit :LOOP
	:SEQ
        SEQ:
	  LOOP: Digit :LOOP UNDERBAR LOOP: HexDigit :LOOP
	:SEQ
	SEQ:
	  LOOP: Digit :LOOP
	  DOT
	  LOOP: Digit :LOOP
	  OPT: Exponent :OPT
	:SEQ
      :CHOICE
    }
    :NONTERM
  } def

/Escape {
    (escape sequence)
    {
      CHOICE:
        HCHOICE:
	  SEQ: BSLASH zn :SEQ
	  SEQ: BSLASH zt :SEQ
	  SEQ: BSLASH zr :SEQ
	  SEQ: BSLASH zf :SEQ
        :HCHOICE
	HCHOICE:
%%          SEQ: BSLASH zb :SEQ
	  SEQ: BSLASH BSLASH :SEQ
	  SEQ: BSLASH SQUOTE :SEQ
	  SEQ: BSLASH DQUOTE :SEQ
	:HCHOICE
	SEQ: BSLASH OctalDigit OctalDigit OctalDigit :SEQ
      :CHOICE
    }
    :NONTERM
  } def

/CharLiteral {
    (character literal)
    { SQUOTE CHOICE: Character Escape DQUOTE :CHOICE SQUOTE}
    :NONTERM
  } def

/TextLiteral {
    (text literal)
    { DQUOTE OLOOP: CHOICE: Character Escape SQUOTE :CHOICE :OLOOP DQUOTE }
    :NONTERM
  } def

/Operator {
    (operator)
    {
      CHOICE:
        HCHOICE:
	  PLUS
          MINUS
	  STAR
          SLASH
	  DOT
          ARROW
	  SEQ: COLON EQ :SEQ
	:HCHOICE
        HCHOICE:
          EQ NE
	  LT
          SEQ: LT EQ :SEQ
	  SEQ: GT EQ :SEQ
          GT
        :HCHOICE
        HCHOICE:
          CONCAT
	  SEQ: LT COLON :SEQ
	  SEQ: EQ GT :SEQ
	  COMMA
	  SEMI
	  BAR
        :HCHOICE
        HCHOICE:
	  COLON
	  SEQ: DOT DOT :SEQ
          LPAREN
          RPAREN
	  LBRACE
	  RBRACE
	  LBRACK
	  RBRACK
       :HCHOICE
      :CHOICE
    }
    :NONTERM
  } def

/Identifier {
    (identifier)
    { Letter OLOOP: CHOICE: Letter Digit UNDERBAR :CHOICE :OLOOP }
    :NONTERM
  } def

/Comment { (comment) { } :NONTERM } def

/Comment {
    (comment)
    {
      LPAREN STAR
      OLOOP: CHOICE: Comment AnyCharacter :CHOICE :OLOOP
      STAR RPAREN
    }
    :NONTERM
  } def

/Pragma { (comment) { } :NONTERM } def

/Pragma {
    (pragma)
    {
      LT STAR
      OLOOP: CHOICE: Pragma AnyCharacter :CHOICE :OLOOP
      STAR GT
    }
    :NONTERM
  } def

/Token {
    (Token)
    {
      CHOICE:
        Identifier
	Operator
	CharLiteral
	TextLiteral
	Number
	Pragma
	Comment
      :CHOICE
    }
    :NONTERM
  } def



/MaxY            7.8 inches def
/MinY            0.3 inches def
/MaxX            11  inches def

/StartColumn     { /LastY MaxY def } def
/ColumnOne       { /BaseX   0 def  StartColumn } def
/ColumnTwo       { /BaseX MaxX 2 div def  StartColumn } def
/Landscape       { 270 rotate 11 neg inches 0 translate } def
/ResetGraphics   { Landscape SCALE 10 div setlinewidth } def
/ShowPage        { showpage ResetGraphics } def
/FlushPage       { ShowPage  ColumnOne } def
/CheckBottom     { LastY MinY lt { FlushPage } if } def

/DoIt {                 % rule indent
    CheckBottom         % rule indent
    5 SCALE mul mul     % rule 5*S*indent
    BaseX add           % rule 5*S*indent+Col
    LastY               % rule 5*S*indent+Col LastY
    3 -1 roll           %      5*S*indent+Col LastY rule
    DrawProduction      % height
    LastY sub neg       % LastY-height
    BOXHgt sub          % LastY-height-BOXHgt
    /LastY exch def     %
  } def % DoIt

ResetGraphics
ColumnOne

LastY
 Identifier       6 DoIt
/LastY exch def
 Token            1 DoIt

 Operator         1 DoIt

LastY
 CharLiteral      6 DoIt
/LastY exch def
 TextLiteral      1 DoIt

 Escape           1 DoIt

LastY
 Comment          1 DoIt
/LastY exch def
 Pragma           6 DoIt

 AnyCharacter     1 DoIt
 Character        1 DoIt
 Extended         1 DoIt

ColumnTwo

 Number           1 DoIt
 Exponent         1 DoIt
 Letter           1 DoIt
 HexDigit         1 DoIt
 Digit            1 DoIt
 OctalDigit       1 DoIt
 Space            1 DoIt
 Special          1 DoIt

FlushPage

end % Modula-3 dictionary 
