Skip to content
New issue

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

Grammar railroad diagram #69

Open
mingodad opened this issue Mar 28, 2022 · 0 comments
Open

Grammar railroad diagram #69

mingodad opened this issue Mar 28, 2022 · 0 comments

Comments

@mingodad
Copy link

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 <[email protected]> */

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  ::= "`"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant