-
Notifications
You must be signed in to change notification settings - Fork 43
Open
Description
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".
/* 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 ::= "`"
Metadata
Metadata
Assignees
Labels
No labels