// // EBNF to be viewd at https://www.bottlecaps.de/rr/ui // // From Domingo Alvarez Duarte (20 September 2023) // // Copy and paste this at https://www.bottlecaps.de/rr/ui // in the 'Edit Grammar' tab // then click the 'View Diagram' tab. // program::= decls decls::= /*%empty*/ | decls decl decl::= record | proc | global | link | invocable invocable::= INVOCABLE invoclist invoclist::= invocop | invoclist COMMA invocop invocop::= IDENT | STRINGLIT | STRINGLIT COLON INTLIT link::= LINK lnklist lnklist::= lnkfile | lnklist COMMA lnkfile lnkfile::= IDENT | STRINGLIT global::= GLOBAL idlist record::= RECORD IDENT LPAREN fldlist RPAREN fldlist::= /*%empty*/ | idlist proc::= prochead SEMICOL locals initial procbody END prochead::= PROCEDURE IDENT LPAREN arglist RPAREN arglist::= /*%empty*/ | idlist | idlist LBRACK RBRACK idlist::= IDENT | idlist COMMA IDENT locals::= /*%empty*/ | locals retention idlist SEMICOL retention::= LOCAL | STATIC initial::= /*%empty*/ | INITIAL expr SEMICOL procbody::= /*%empty*/ | nexpr SEMICOL procbody nexpr::= /*%empty*/ | expr expr::= expr1a | expr AND expr1a expr1a::= expr1 | expr1a QMARK expr1 expr1::= expr2 | expr2 SWAP expr1 | expr2 ASSIGN expr1 | expr2 REVSWAP expr1 | expr2 REVASSIGN expr1 | expr2 AUGCONCAT expr1 | expr2 AUGLCONCAT expr1 | expr2 AUGDIFF expr1 | expr2 AUGUNION expr1 | expr2 AUGPLUS expr1 | expr2 AUGMINUS expr1 | expr2 AUGSTAR expr1 | expr2 AUGINTER expr1 | expr2 AUGSLASH expr1 | expr2 AUGMOD expr1 | expr2 AUGCARET expr1 | expr2 AUGNMEQ expr1 | expr2 AUGEQUIV expr1 | expr2 AUGNMGE expr1 | expr2 AUGNMGT expr1 | expr2 AUGNMLE expr1 | expr2 AUGNMLT expr1 | expr2 AUGNMNE expr1 | expr2 AUGNEQUIV expr1 | expr2 AUGSEQ expr1 | expr2 AUGSGE expr1 | expr2 AUGSGT expr1 | expr2 AUGSLE expr1 | expr2 AUGSLT expr1 | expr2 AUGSNE expr1 | expr2 AUGQMARK expr1 | expr2 AUGAND expr1 | expr2 AUGAT expr1 expr2::= expr3 | expr2 TO expr3 | expr2 TO expr3 BY expr3 expr3::= expr4 | expr4 BAR expr3 expr4::= expr5 | expr4 SEQ expr5 | expr4 SGE expr5 | expr4 SGT expr5 | expr4 SLE expr5 | expr4 SLT expr5 | expr4 SNE expr5 | expr4 NMEQ expr5 | expr4 NMGE expr5 | expr4 NMGT expr5 | expr4 NMLE expr5 | expr4 NMLT expr5 | expr4 NMNE expr5 | expr4 EQUIV expr5 | expr4 NEQUIV expr5 expr5::= expr6 | expr5 CONCAT expr6 | expr5 LCONCAT expr6 expr6::= expr7 | expr6 PLUS expr7 | expr6 DIFF expr7 | expr6 UNION expr7 | expr6 MINUS expr7 expr7::= expr8 | expr7 STAR expr8 | expr7 INTER expr8 | expr7 SLASH expr8 | expr7 MOD expr8 expr8::= expr9 | expr9 CARET expr8 expr9::= expr10 | expr9 BACKSLASH expr10 | expr9 AT expr10 | expr9 BANG expr10 expr10::= expr11 | AT expr10 | NOT expr10 | BAR expr10 | CONCAT expr10 | LCONCAT expr10 | DOT expr10 | BANG expr10 | DIFF expr10 | PLUS expr10 | STAR expr10 | SLASH expr10 | CARET expr10 | INTER expr10 | TILDE expr10 | MINUS expr10 | NMEQ expr10 | NMNE expr10 | SEQ expr10 | SNE expr10 | EQUIV expr10 | UNION expr10 | QMARK expr10 | NEQUIV expr10 | BACKSLASH expr10 expr11::= literal | section | return | if | case | while | until | every | repeat | CREATE expr | IDENT | NEXT | BREAK nexpr | LPAREN exprlist RPAREN | LBRACE compound RBRACE | LBRACK exprlist RBRACK | expr11 LBRACK exprlist RBRACK | expr11 LBRACE RBRACE | expr11 LBRACE pdcolist RBRACE | expr11 LPAREN exprlist RPAREN | expr11 DOT IDENT | AND FAIL | AND IDENT while::= WHILE expr | WHILE expr DO expr until::= UNTIL expr | UNTIL expr DO expr every::= EVERY expr | EVERY expr DO expr repeat::= REPEAT expr return::= FAIL | RETURN nexpr | SUSPEND nexpr | SUSPEND expr DO expr if::= IF expr THEN expr | IF expr THEN expr ELSE expr case::= CASE expr OF LBRACE caselist RBRACE caselist::= cclause | caselist SEMICOL cclause cclause::= DEFAULT COLON expr | expr COLON expr exprlist::= nexpr | exprlist COMMA nexpr pdcolist::= nexpr | pdcolist COMMA nexpr literal::= INTLIT | REALLIT | STRINGLIT | CSETLIT section::= expr11 LBRACK expr sectop expr RBRACK sectop::= COLON | PCOLON | MCOLON compound::= nexpr | nexpr SEMICOL compound //Tokens /* reserved words */ BREAK ::= "break" BY ::= "by" CASE ::= "case" CREATE ::= "create" DEFAULT ::= "default" DO ::= "do" ELSE ::= "else" END ::= "end" EVERY ::= "every" FAIL ::= "fail" GLOBAL ::= "global" IF ::= "if" INITIAL ::= "initial" INVOCABLE ::= "invocable" LINK ::= "link" LOCAL ::= "local" NEXT ::= "next" NOT ::= "not" OF ::= "of" PROCEDURE ::= "procedure" RECORD ::= "record" REPEAT ::= "repeat" RETURN ::= "return" STATIC ::= "static" SUSPEND ::= "suspend" THEN ::= "then" TO ::= "to" UNTIL ::= "until" WHILE ::= "while" operators ::= /* */ BANG ::= "!" MOD ::= "%" AUGMOD ::= "%:=" AND ::= "&" AUGAND ::= "&:=" STAR ::= "*" AUGSTAR ::= "*:=" INTER ::= "**" AUGINTER ::= "**:=" PLUS ::= "+" AUGPLUS ::= "+:=" UNION ::= "++" AUGUNION ::= "++:=" MINUS ::= "-" AUGMINUS ::= "-:=" DIFF ::= "--" AUGDIFF ::= "--:=" DOT ::= "." SLASH ::= "/" AUGSLASH ::= "/:=" ASSIGN ::= ":=" SWAP ::= ":=:" NMLT ::= "<" AUGNMLT ::= "<:=" REVASSIGN ::= "<-" REVSWAP ::= "<->" SLT ::= "<<" AUGSLT ::= "<<:=" SLE ::= "<<=" AUGSLE ::= "<<=:=" NMLE ::= "<=" AUGNMLE ::= "<=:=" NMEQ ::= "=" AUGNMEQ ::= "=:=" SEQ ::= "==" AUGSEQ ::= "==:=" EQUIV ::= "===" AUGEQUIV ::= "===:=" NMGT ::= ">" AUGNMGT ::= ">:=" NMGE ::= ">=" AUGNMGE ::= ">=:=" SGT ::= ">>" AUGSGT ::= ">>:=" SGE ::= ">>=" AUGSGE ::= ">>=:=" QMARK ::= "?" AUGQMARK ::= "?:=" AT ::= "@" AUGAT ::= "@:=" BACKSLASH ::= "\\" CARET ::= "^" AUGCARET ::= "^:=" BAR ::= "|" CONCAT ::= "||" AUGCONCAT ::= "||:=" LCONCAT ::= "|||" AUGLCONCAT ::= "|||:=" TILDE ::= "~" NMNE ::= "~=" AUGNMNE ::= "~=:=" SNE ::= "~==" AUGSNE ::= "~==:=" NEQUIV ::= "~===" AUGNEQUIV ::= "~===:=" LPAREN ::= "(" RPAREN ::= ")" PCOLON ::= "+:" COMMA ::= "," MCOLON ::= "-:" COLON ::= ":" SEMICOL ::= ";" LBRACK ::= "[" RBRACK ::= "]" LBRACE ::= "{" RBRACE ::= "}"