We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Using this tool https://www.bottlecaps.de/convert/ to convert the grammar at https://github.com/kfl/mosml/blob/master/src/compiler/Parser.grm and adding the tokens from https://github.com/kfl/mosml/blob/master/src/compiler/Lexer.lex manually and moving the %start rules to the top to facilitate navigation we can get a nice railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram) at https://www.bottlecaps.de/rr/ui .
%start
Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui in the tab "Edit Grammar" then switch to the tab "View Diagram".
/* converted on Mon Mar 28, 2022, 13:43 (UTC+02) by bison-to-w3c v0.57 which is Copyright (c) 2011-2022 by Gunther Rademacher <grd@gmx.net> */ ToplevelPhrase ::= ( Exp | KWDec* ) EOPh TopSpecFile ::= ( KWSpec | SEMICOLON )* EOF SigFile ::= SIGNATURE SigId EQUALS SigExp SemiEof | ( KWCoreSpec | SEMICOLON )* EOF TopDecFile ::= ( KWDec | SEMICOLON )* EOF StructFile ::= STRUCTURE ModId ( COLONGT SigId )? EQUALS ModExp SemiEof | ( KWCoreDec | SEMICOLON )* EOF Ident ::= ID | STAR IdentWithLoc ::= Ident OpIdent ::= OP? Ident EqIdent ::= Ident | EQUALS ModId ::= IdentWithLoc SigId ::= IdentWithLoc TypeIdent ::= ID LongTypeIdent ::= TypeIdent | QUAL_ID LongIdent ::= Ident | QUAL_ID | QUAL_STAR LongOpIdent ::= LongIdent | OP ( Ident | QUAL_ID | QUAL_STAR ) LongOpEqIdent ::= LongOpIdent | OP? EQUALS TyVar ::= TYVAR EqIdent_seq1 ::= EqIdent+ LongModId ::= LongOpIdent LongModIdInfo_seq1 ::= LongModId+ DIGIT_opt ::= ( ZDIGIT | NZDIGIT )? Integer ::= ZPOSINT2 | NZPOSINT2 | NEGINT | ZDIGIT | NZDIGIT NumLabel ::= NZPOSINT2 | NZDIGIT Label ::= Ident | NumLabel Arity ::= ZPOSINT2 | NZPOSINT2 | ZDIGIT | NZDIGIT //ToplevelPhrase // ::= ( Exp | KWDec* ) EOPh EOPh ::= SEMICOLON | EOF SemiEof ::= SEMICOLON* EOF Dec ::= ( KWDec | SEMICOLON )* //TopDecFile // ::= ( KWDec | SEMICOLON )* EOF //StructFile // ::= STRUCTURE ModId ( COLONGT SigId )? EQUALS ModExp SemiEof // | ( KWCoreDec | SEMICOLON )* EOF KWDec ::= KWCoreDec | KWModuleDec KWModuleDec ::= STRUCTURE ModBind_seq1 | FUNCTOR FunBind_seq1 | SIGNATURE SigBind_seq1 KWCoreDec ::= VAL TyVarSeq1? ValBind | PRIM_VAL TyVarSeq1? PrimValBind | FUN TyVarSeq1? FValBind | TYPE TypBind | ( PRIM_TYPE | PRIM_EQTYPE | PRIM_REFTYPE ) TypDesc | DATATYPE ( ( DatBind_0 | DatBind_n ) WithType_opt | TyCon EQUALS DATATYPE TyConPath ) | ( ABSTYPE DatBind WithType_opt WITH | LOCAL Dec IN ) Dec END | EXCEPTION ExBind | OPEN LongModIdInfo_seq1 | ( ( INFIX | INFIXR ) DIGIT_opt | NONFIX ) EqIdent_seq1 ValBind ::= Pat EQUALS Exp AndValBind_opt | REC FnValBind AndValBind_opt ::= ( AND ValBind )? PrimValBind ::= OpIdent COLON Ty EQUALS Arity STRING AndPrimValBind_opt AndPrimValBind_opt ::= ( AND PrimValBind )? FnValBind ::= REC* Pat EQUALS Exp AndFnValBind_opt AndFnValBind_opt ::= ( AND FnValBind )? TypBind ::= TyVarSeq TyCon EQUALS Ty AndTypBind_opt AndTypBind_opt ::= ( AND TypBind )? DatBind ::= TyVarSeq TyCon EQUALS ConBind AndDatBind_opt DatBind_0 ::= TyCon EQUALS ConBind AndDatBind_opt DatBind_n ::= TyVarSeq1 TyCon EQUALS ConBind AndDatBind_opt AndDatBind_opt ::= ( AND DatBind )? ConBind ::= OpIdent OfTy_opt BarConBind_opt BarConBind_opt ::= ( BAR ConBind )? WithType_opt ::= ( WITHTYPE TypBind )? ExBind ::= OpIdent ( OfTy_opt | EQUALS LongOpEqIdent ) AndExBind_opt AndExBind_opt ::= ( AND ExBind )? ExDesc ::= OpIdent OfTy_opt AndExDesc_opt AndExDesc_opt ::= ( AND ExDesc )? ColonTy_opt ::= ( COLON Ty )? OfTy_opt ::= ( OF Ty )? FValBind ::= FClauseWithLoc AndFValBind_opt AndFValBind_opt ::= ( AND FValBind )? FClauseWithLoc ::= FClause FClause ::= AtPat_seq1 ColonTy_opt EQUALS Exp BarFClause_opt BarFClause_opt ::= ( BAR FClause )? SCon ::= Integer | WORD | CHAR | REAL | STRING VIdPathInfo ::= LongOpEqIdent AtExp ::= SCon | VIdPathInfo | LET Dec IN ( Exp | ExpSemicolon_seq2 ) END | HASH Label | LPAREN ( Exp | ExpComma_seq2 | ExpSemicolon_seq2 )? RPAREN | LBRACE ExpRow_opt RBRACE | ( LBRACKET ( ( STRUCTURE | FUNCTOR ) ModExp AS SigExp | ExpComma_seq0 ) | HASHLBRACKET ExpComma_seq0 ) RBRACKET | QUOTEL QuoteTail QuoteTail ::= QUOTER | QUOTEM ExpQuoteTail ExpQuoteTail ::= Exp QuoteTail ExpComma_seq0 ::= ExpComma_seq1? ExpComma_seq1 ::= Exp ( COMMA Exp )* ExpComma_seq2 ::= Exp COMMA ExpComma_seq1 ExpSemicolon_seq2 ::= Exp ( SEMICOLON Exp )+ ExpRow_opt ::= ExpRow? ExpRow ::= Label EQUALS Exp CommaExpRow_opt CommaExpRow_opt ::= ( COMMA ExpRow )? InfixExp ::= AtExp+ Exp ::= InfixExp | Exp ( COLON Ty | ( ANDALSO | ORELSE ) Exp | HANDLE Match ) | ( RAISE | IF Exp THEN Exp ELSE | WHILE Exp DO ) Exp | CASE Exp OF MatchWithLoc | FN Match MatchWithLoc ::= Match Match ::= MRule ( BAR MRule )* MRule ::= Pat DARROW Exp InfixPat ::= AtPat_seq1 Pat ::= InfixPat | Pat ( COLON Ty | AS Pat ) AtPat ::= UNDERBAR | SCon | LongOpIdent | LBRACE PatRow_opt RBRACE | LPAREN ( Pat | PatComma_seq2 )? RPAREN | ( LBRACKET | HASHLBRACKET ) PatComma_seq0 RBRACKET PatRow_opt ::= PatRow? PatRow ::= DOTDOTDOT | ( Label EQUALS Pat | IdentWithLoc ColonTy_opt AsPat_opt ) CommaPatRow_opt AsPat_opt ::= ( AS Pat )? CommaPatRow_opt ::= ( COMMA PatRow )? AtPat_seq1 ::= AtPat+ PatComma_seq0 ::= PatComma_seq1? PatComma_seq1 ::= Pat ( COMMA Pat )* PatComma_seq2 ::= Pat COMMA PatComma_seq1 TyCon ::= ID WhereModBind_opt ::= ( WHERE ModId OptConEqualsModExp )? TyConPath ::= LongTypeIdent WhereModBind_opt Ty ::= TupleTy ( ARROW TupleTy )* TupleTy ::= Ty_sans_STAR ( STAR Ty_sans_STAR )* Ty_sans_STAR ::= ( LPAREN Ty ( COMMA Ty )+ RPAREN TyConPath | AtomicTy ) TyConPath* AtomicTy ::= TyConPath | TyVar | LBRACE TyRow_opt RBRACE | LBRACKET SigExp RBRACKET | LPAREN Ty RPAREN TyRow_opt ::= TyRow? TyRow ::= Label COLON Ty CommaTyRow_opt CommaTyRow_opt ::= ( COMMA TyRow )? TyVarSeq ::= TyVarSeq1? TyVarSeq1 ::= TyVar | LPAREN TyVar ( COMMA TyVar )* RPAREN LongTyConEqnTail ::= LongTypeIdent | LongTyConEqn LongTyConEqn ::= LongTypeIdent EQUALS LongTyConEqnTail LongModIdEqnTail ::= LongModId | LongModIdEqn LongModIdEqn ::= LongModId EQUALS LongModIdEqnTail LongModIdEqnWithLoc ::= LongModIdEqn Spec ::= ( KWSpec | SHARING ( TYPE LongTyConEqn | LongModIdEqnWithLoc ) | SEMICOLON )* //TopSpecFile // ::= ( KWSpec | SEMICOLON )* EOF //SigFile ::= SIGNATURE SigId EQUALS SigExp SemiEof // | ( KWCoreSpec | SEMICOLON )* EOF KWSpec ::= KWCoreSpec | KWModuleSpec KWCoreSpec ::= VAL TyVarSeq ValDesc | PRIM_VAL TyVarSeq1? PrimValBind | TYPE ( TypBind | TypDesc ) | ( EQTYPE | PRIM_REFTYPE ) TypDesc | DATATYPE ( ( DatBind_0 | DatBind_n ) WithType_opt | TyCon EQUALS DATATYPE TyConPath ) | EXCEPTION ExDesc | LOCAL Spec IN Spec END | OPEN LongModIdInfo_seq1 | ( ( INFIX | INFIXR ) DIGIT_opt | NONFIX ) EqIdent_seq1 KWModuleSpec ::= STRUCTURE ModDesc_seq1 | FUNCTOR FunDesc_seq1 | INCLUDE ( SigExp | SigId SigId+ ) | SIGNATURE SigBind_seq1 ValDesc ::= OpIdent COLON Ty AndValDesc_opt AndValDesc_opt ::= ( AND ValDesc )? TypDesc ::= TyVarSeq TyCon AndTypDesc_opt AndTypDesc_opt ::= ( AND TypDesc )? ModBind_seq1 ::= ModId ( OptConEqualsModExp | AS SigExp EQUALS Exp ) AndModBind_opt AndModBind_opt ::= ( AND ModBind_seq1 )? OptConEqualsModExp ::= ( ( COLON | COLONGT ) SigExp )? EQUALS ModExp FunBind_seq1 ::= ModId ( AS SigExp EQUALS Exp | ( SIG Spec END )? OptConEqualsModExp | ModId COLON SigExp FunBindBody | LPAREN ( ModId COLON SigExp RPAREN FunBindBody | Spec RPAREN OptConEqualsModExp ) ) AndFunBind_opt AndFunBind_opt ::= ( AND FunBind_seq1 )? SigBind_seq1 ::= SigId EQUALS SigExp AndSigBind_opt AndSigBind_opt ::= ( AND SigBind_seq1 )? FunBindBody ::= ( LPAREN ModId COLON SigExp RPAREN | ModId COLON SigExp )* OptConEqualsModExp AtModExp ::= ( STRUCT Dec | LET Dec IN ModExp ) END | LongModId | LPAREN ( ModExp | Dec ) RPAREN ModExp ::= AtModExp+ | ModExp ( COLONGT | COLON ) SigExp | ( FUNCTOR ( ModId COLON SigExp | LPAREN ModId COLON SigExp RPAREN ) DARROW | REC LPAREN ModId COLON SigExp RPAREN ) ModExp ModDesc_seq1 ::= ModId COLON SigExp AndModDesc_opt AndModDesc_opt ::= ( AND ModDesc_seq1 )? FunDesc_seq1 ::= ModId ( LPAREN ModId COLON SigExp RPAREN | ModId COLON SigExp )* COLON SigExp AndFunDesc_opt AndFunDesc_opt ::= ( AND FunDesc_seq1 )? SigExp ::= SIG Spec END | SigId | SigExp WHERE WhereType | ( FUNCTOR ( LPAREN ModId COLON SigExp RPAREN | ModId COLON SigExp ) ARROW | REC LPAREN ModId COLON SigExp RPAREN ) SigExp WhereType ::= TYPE TyVarSeq LongTypeIdent EQUALS Ty AndWhereType_opt AndWhereType_opt ::= ( AND WhereType )? //Tokens //\s*(\("[^"]+"\),\s+\(\S[^)]+\).+ ABSTYPE ::= "abstype" AND ::= "and" ANDALSO ::= "andalso" AS ::= "as" CASE ::= "case" DATATYPE ::= "datatype" DO ::= "do" ELSE ::= "else" EQTYPE ::= "eqtype" END ::= "end" EXCEPTION ::= "exception" FN ::= "fn" FUN ::= "fun" FUNCTOR ::= "functor" HANDLE ::= "handle" IF ::= "if" IN ::= "in" INCLUDE ::= "include" INFIX ::= "infix" INFIXR ::= "infixr" LET ::= "let" LOCAL ::= "local" NONFIX ::= "nonfix" OF ::= "of" OP ::= "op" OPEN ::= "open" ORELSE ::= "orelse" PRIM_EQTYPE ::= "prim_eqtype" PRIM_REFTYPE ::= "prim_EQtype" PRIM_TYPE ::= "prim_type" PRIM_VAL ::= "prim_val" RAISE ::= "raise" REC ::= "rec" SHARING ::= "sharing" SIG ::= "sig" SIGNATURE ::= "signature" STRUCT ::= "struct" STRUCTURE ::= "structure" THEN ::= "then" TYPE ::= "type" VAL ::= "val" WHERE ::= "where" WHILE ::= "while" WITH ::= "with" WITHTYPE ::= "withtype" HASH ::= "#" ARROW ::= "->" BAR ::= "|" COLONGT ::= ":>" COLON ::= ":" DARROW ::= "=>" EQUALS ::= "=" STAR ::= "*" UNDERBAR ::= "_" COMMA ::= "," DOTDOTDOT ::= "..." LBRACE ::= "{" RBRACE ::= "}" LBRACKET ::= "[" HASHLBRACKET ::= "#[" RBRACKET ::= "]" LPAREN ::= "(" RPAREN ::= ")" SEMICOLON ::= ";" QUOTEL ::= "`"
The text was updated successfully, but these errors were encountered:
No branches or pull requests
Using this tool https://www.bottlecaps.de/convert/ to convert the grammar at https://github.com/kfl/mosml/blob/master/src/compiler/Parser.grm and adding the tokens from https://github.com/kfl/mosml/blob/master/src/compiler/Lexer.lex manually and moving the
%start
rules to the top to facilitate navigation we can get a nice railroad diagram (https://en.wikipedia.org/wiki/Syntax_diagram) at https://www.bottlecaps.de/rr/ui .Copy and paste the EBNF shown bellow on https://www.bottlecaps.de/rr/ui in the tab "Edit Grammar" then switch to the tab "View Diagram".
The text was updated successfully, but these errors were encountered: