Skip to content

Grammar railroad diagram #69

@mingodad

Description

@mingodad

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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions