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