31
D(NAME)                                {This BIP accpets any name}
D(ICONST)                              {This BIP accepts any integer constant}
D(CONST)                               {This BIP accepts any constant}
D(ONAME)                               {This BIP accepts any previously declared name}
D(COMTEXT)                             {This BIP accepts normal comment text}
D(S)                                   {This BIP accepts any Separator}
D(ENDTEXT)                             {This BIP accepts end comment text}
D(TEXTTEXT)                            {This BIP an Algol string}
D(HOLE)                                {This BIP leaves a hole in the tree for mark}
D(MARK)                                {This BIP Puts a pointer into the last "hole"}
D(UPSTCNT)                             {This BIP Increments the statement count}
D(LETTERSTRING)                        {This BIP accpets a parameter comment}
D(DOWN)                                {This BIP increments the textual level}
D(UP)                                  {This BIP decrements the textual level and massages the dictionary}
D(SCALARTYPE)                          {This BIP notes the current setting of type}
D(NOTENAME)                            {This BIP records the current name in the dictionary}
D(TYPE=A)                              {This BIP checks the current name is integer or real}
D(TYPE=B)                              {This BIP checks the current name is Boolean}
D(ARRAYTYPE)                           {This BIP notes the current type and adds the array bit}
D(PROCTYPE)                            {This BIP sets the current type to procedure}
D(CHKLPL)                              {This BIP Looks ahead for ":="}
D(LABTYPE)                             {This BIP set the current type to label}
D(SWTYPE)                              {This BIP set the current type to switch}
D(STRTYPE)                             {This BIP sets the current type to string}
D(CHKLAB)                              {This BIP looks ahead for ":"}
D(TYPE=ARR)                            {This BIP checks the current type is array}
D(LINKPROC)                            {This BIP actions the linking of procedure headings}
D(LINKLAB)                             {This BIP actions the linking of labels}
D(NOMORE)                              {This BIP checks the next symbol is not a Boolean operator}
D(CMPND)                               {This BIP  notes the start of a compound statement}
D(UPATSEP)                             {This BIP sets a flag so thet the next occurrence of 
                                      a seperator will action an "UP"}


                        { all the rest are syntactically defined}

D(optplus)
D(OP)
D(DECLIST)
D(RESTOFDECLIST)
D(RESTOFONAMELIST)
D(OPERAND)
D(EXPR)
D(RESTOFEXPR)
D(APP)
D(RESTOFAPP)
D(LABAPP)
D(BCONST)
D(BOP)
D(BTERM)
D(SBEXPR)
D(RESTOFSBEXPR)
D(BEXPR)
D(BOPERAND)
D(TYPE)
D(OPTTYPE)
D(VALUEPART)
D(FP-DEL)
D(FPP)
D(RESTOFFP-LIST)
D(FPSEP)
D(OPTCOM)
D(FPSPEC)
D(PARCOM)
D(OPTCOLON)
D(COMVAL)
D(COMFP)
D(COMDEL)
D(CNLIST)
D(RESTOFCNLIST)
D(SDE)
D(DE)
D(RESTOFDELIST)
D(RTP)
D(RESTOFRTPLIST)
D(RESTOFASS)
D(RESTOFBLP)
D(RESTOFALP)
D(RESTOFFLE)
D(RESTOFFORLIST)
D(RESTOFBP-LIST)
D(DECLN)
D(ADECLN)
D(RESTOFARRAYLIST)
D(BPAIR)
D(CBPAIR)
D(RESTOFCBP)
D(OADECLN)
D(RESTOFOADEC)
D(COMP)
D(OLABEL)
D(NonnullSTMT)
D(FORSTMNT)
D(STMT)
D(BLKORCS)
D(FSTMT)
D(USTMT)
D(PROCSTMT)
D(ELSECLAUSE)
D(ELSESTMNT)
D(UbasicSTMNT)
D(SS)


                        { The phrase definitions follow}

P(DECLIST)            =(NAME)(NOTENAME)(RESTOFDECLIST);

P(RESTOFDECLIST)      =","(NAME)(NOTENAME)(RESTOFDECLIST),0;

P(RESTOFONAMELIST)    =","(ONAME)(RESTOFONAMELIST),0;

P(optplus)            ="+","-",0;

P(OPERAND)            =(NAME)(APP),(CONST),
                       "("(EXPR)")";

P(EXPR)               ="%IF"(BEXPR)"%THEN"(HOLE)(optplus)(OPERAND)
                       (MARK)(RESTOFEXPR)"%ELSE"(EXPR),
                       (HOLE)(optplus)(OPERAND)(MARK)(RESTOFEXPR);

P(RESTOFEXPR)         =(OP)(OPERAND)(RESTOFEXPR),0;

P(APP)                =(TYPE=ARR)"["(EXPR)(RESTOFAPP)"]",
                       "("(HOLE)(RTP)(MARK)(RESTOFRTPLIST)")",0;

P(RESTOFAPP)          =","(EXPR)(RESTOFAPP),0;

P(LABAPP)             ="["(EXPR)(RESTOFAPP)"]",
                       "("(HOLE)(RTP)(MARK)(RESTOFRTPLIST)")",0;

P(OP)                 ="^","**","+","-","*","/","%DIV";

P(BCONST)             ="%TRUE","%FALSE";

P(BOP)                ="%AND","%OR","%IMPL","%EQUIV";

P(BTERM)              = "%NOT"(BOPERAND),(BOPERAND);

P(SBEXPR)             =(BTERM)(RESTOFSBEXPR);

P(RESTOFSBEXPR)       =(BOP)(BTERM)(RESTOFSBEXPR),0;

P(BEXPR)              = "%IF"(BEXPR)"%THEN"(SBEXPR)"%ELSE"(BEXPR),(SBEXPR);

P(BOPERAND)           =(EXPR)(COMP)(EXPR),(NAME)(APP),(BCONST),
                       "("(BEXPR)")";

P(TYPE)               ="%INTEGER","%REAL","%BOOLEAN";

P(OPTTYPE)            ="%INTEGER","%REAL","%BOOLEAN",0;

P(VALUEPART)          =";"(OPTCOM)"%VALUE"(ONAME)(RESTOFONAMELIST)(UPSTCNT),0;

P(FP-DEL)             ="%LABEL"(LABTYPE)(DECLIST),"%SWITCH"(SWTYPE)(DECLIST),
                       "%STRING"(STRTYPE)(DECLIST),
                       (OPTTYPE)"%ARRAY"(ARRAYTYPE)(DECLIST),
                       (OPTTYPE)"%PROCEDURE"(PROCTYPE)(DECLIST)(PARCOM),
                       (TYPE)(SCALARTYPE)(DECLIST);

P(FPP)                ="("(NAME)(RESTOFFP-LIST)")",0;

P(RESTOFFP-LIST)      =(FPSEP)(NAME)(RESTOFFP-LIST),0;

P(FPSEP)              =",",")"(LETTERSTRING)":(";

P(OPTCOM)             ="%COMMENT"(COMTEXT)(UPSTCNT)(OPTCOM),0;

P(FPSPEC)             =";"(OPTCOM)(FP-DEL)(UPSTCNT)(FPSPEC),0;

P(PARCOM)             =";" "%COMMENT"(HOLE) "("(NAME)(RESTOFFP-LIST)")"
                       (COMVAL)(COMFP)(MARK)(UPSTCNT),0;

P(OPTCOLON)           =":",0;

P(COMVAL)             =(OPTCOLON)"%VALUE"(ONAME)(RESTOFONAMELIST),0;

P(COMFP)              =(OPTCOLON)(COMDEL)(COMFP),0;

P(COMDEL)             ="%LABEL"(CNLIST),"%SWITCH"(CNLIST),
                       "%STRING"(CNLIST),(OPTTYPE)"%ARRAY"(CNLIST),
                       (OPTTYPE)"%PROCEDURE"(CNLIST),(TYPE)(CNLIST);

P(CNLIST)             =(NAME)(RESTOFCNLIST);

P(RESTOFCNLIST)       =","(NAME)(RESTOFCNLIST),0;

P(SDE)                =(NAME)(LABAPP),"("(DE)")";

P(DE)                 ="%IF"(BEXPR)"%THEN"(SDE)"%ELSE"(DE),(SDE);

P(RESTOFDELIST)       =","(HOLE)(DE)(MARK)(RESTOFDELIST),0;

P(RTP)                =(TEXTTEXT),(NAME)(APP)(NOMORE),
                       (EXPR)(NOMORE),(BEXPR)(NOMORE),(DE)(NOMORE);

P(RESTOFRTPLIST)      =(FPSEP)(HOLE)(RTP)(MARK)(RESTOFRTPLIST),0;

P(RESTOFASS)          =(TYPE=B)(APP)":="(RESTOFBLP)(BEXPR),
                       (TYPE=A)(APP)":="(RESTOFALP)(EXPR);

P(RESTOFBLP)          =(CHKLPL)(ONAME)(TYPE=B)(APP)":="(RESTOFBLP),0;

P(RESTOFALP)          =(CHKLPL)(ONAME)(TYPE=A)(APP)":="(RESTOFALP),0;

P(RESTOFFLE)          ="%STEP"(EXPR)"%UNTIL"(EXPR),
                       "%WHILE"(BEXPR),0;

P(RESTOFFORLIST)      =","(EXPR)(RESTOFFLE)(RESTOFFORLIST),0;

P(RESTOFBP-LIST)      =","(EXPR)":"(EXPR)(RESTOFBP-LIST),0;

P(DECLN)              =(TYPE)(SCALARTYPE)(DECLIST),
                       (OPTTYPE)"%ARRAY"(ARRAYTYPE)(OADECLN);

P(ADECLN)             =(DECLIST)(BPAIR)(RESTOFARRAYLIST);

P(RESTOFARRAYLIST)    =","(ADECLN),0;

P(BPAIR)              =(CBPAIR),"["(EXPR)":"(EXPR)(RESTOFBP-LIST)"]";

P(CBPAIR)             ="["(optplus)(ICONST)":"(optplus)(ICONST)(RESTOFCBP)"]";

P(RESTOFCBP)          =","(optplus)(ICONST)":"(optplus)(ICONST)(RESTOFCBP),0;

P(OADECLN)            =(DECLIST)(CBPAIR)(RESTOFOADEC);

P(RESTOFOADEC)        =","(OADECLN),0;

P(COMP)               ="=",">=",">","#","<=","<","\=";

P(OLABEL)             =(CHKLAB)(NAME)":"(LINKLAB)(OLABEL),0;

P(NonnullSTMT)        =(UbasicSTMNT),
                       "%FOR"(FORSTMNT),
                       "%IF"(BEXPR)"%THEN"(OLABEL)(USTMT);

P(FORSTMNT)           =(HOLE)(ONAME)(APP)":="(EXPR)(RESTOFFLE)(MARK)
                       (RESTOFFORLIST)"%DO"(OLABEL)(FSTMT);

P(STMT)               =(UbasicSTMNT),
                       "%FOR"(FORSTMNT),
                       "%IF"(BEXPR)"%THEN"(OLABEL)(USTMT),0;

P(BLKORCS)            =(OPTCOM)(OLABEL)(NonnullSTMT)(CMPND),(DOWN);

P(FSTMT)              ="%BEGIN"(DOWN),(STMT);

P(USTMT)              ="%BEGIN"(BLKORCS),
                       "%FOR"(FORSTMNT),
                       (UbasicSTMNT)(ELSECLAUSE),
                       (ELSECLAUSE);

P(PROCSTMT)           ="%BEGIN",(UPATSEP)(STMT);

P(ELSECLAUSE)         ="%ELSE"(OLABEL)(ELSESTMNT),0;

P(ELSESTMNT)          ="%BEGIN"(BLKORCS),(STMT);

P(UbasicSTMNT)        =(CHKLPL)(ONAME)(RESTOFASS),
                       (NAME)(APP),
                       "%GOTO"(DE);

P(SS)                 =(NonnullSTMT)(S),
                       "%END"(UP)(ENDTEXT)(ELSECLAUSE)(S),
                       (OPTTYPE)"%PROCEDURE"(PROCTYPE)(LINKPROC)(HOLE)(NAME)
                          (NOTENAME)(FPP)(DOWN)(VALUEPART)(FPSPEC)";"(OPTCOM)
                          (UPSTCNT)(MARK)(OLABEL)(PROCSTMT)(S),
                       (OPTTYPE)"%ARRAY"(ARRAYTYPE)(ADECLN)(S),
                       (TYPE)(SCALARTYPE)(DECLIST)(S),

                       "%BEGIN"(DOWN),
                       "%SWITCH"(SWTYPE)(NAME)(NOTENAME)":="(HOLE)
                          (DE)(MARK)(RESTOFDELIST)(S),
                       "%OWN"(DECLN)(S),
                        (CHKLAB)(NAME)":"(LINKLAB)(SS),
                       "%COMMENT"(COMTEXT),
                       "%SPECIAL""%NAME"(NAME)(S),
                       ";";
E