Skip to content

Grammar railroad diagram #233

@mingodad

Description

@mingodad

While trying to add frontend/src/Language/Granule/Syntax/Parser.y to https://mingodad.github.io/parsertl-playground/playground/ an Yacc/Lex compatible online editor/tester I found that the grammar has too many conflicts and didn't continue but at least I've got an EBNF understood by https://www.bottlecaps.de/rr/ui to generate a nice navigable railroad diagram, see bellow.

//
// EBNF to be viewd at https://www.bottlecaps.de/rr/ui
//
// Copy and paste this at https://www.bottlecaps.de/rr/ui in the 'Edit Grammar' tab
// then click the 'View Diagram' tab.
//

TopLevel::=
	  module CONSTR where NL Defs
	| module CONSTR hiding '(' Ids ')' where NL Defs
	| language CONSTR NL TopLevel
	| Defs

Ids::=
	  CONSTR
	| CONSTR ',' Ids

Defs::=
	  Def
	| DataDecl
	| Import
	| DataDecl NL Defs
	| Def NL Defs
	| Import NL Defs

NL::=
	  nl NL
	| nl

Import::=
	  import

Def::=
	  Sig NL Bindings
	| Sig NL Spec NL Bindings

Spec::=
	  spec SpecList

SpecList::=
	  Example ';' SpecList
	| Components
	| /*%empty*/

Example::=
	  Expr '=' Expr '!' CONSTR
	| Expr '=' Expr

Components::=
	  VAR
	| VAR '%' Coeffect
	| VAR ',' Components
	| VAR '%' Coeffect ',' Components
	| /*%empty*/

DataDecl::=
	  data CONSTR TyVars KindAnn where DataConstrs
	| data CONSTR TyVars KindAnn '=' DataConstrs

Sig::=
	  VAR ':' TypeScheme

Bindings::=
	  Binding ';' NL Bindings
	| Binding

Binding::=
	  VAR '=' Expr
	| VAR Pats '=' Expr

DataConstrs::=
	  DataConstr DataConstrNext
	| /*%empty*/

DataConstr::=
	  CONSTR ':' TypeScheme
	| CONSTR TyParams

DataConstrNext::=
	  '|' DataConstrs
	| ';' DataConstrs
	| /*%empty*/

TyVars::=
	  '(' VAR ':' Kind ')' TyVars
	| VAR TyVars
	| /*%empty*/

KindAnn::=
	  ':' Kind
	| /*%empty*/

Pats::=
	  PAtom
	| PAtom Pats

PAtom::=
	  VAR
	| '_'
	| INT
	| FLOAT
	| CONSTR
	| '(' NAryConstr ')'
	| '[' PAtom ']'
	| '!' PAtom
	| '[' NAryConstr ']'
	| '(' PMolecule ',' PMolecule ')'

PMolecule::=
	  NAryConstr
	| PAtom

NAryConstr::=
	  CONSTR Pats

ForallSig::=
	  '{' VarSigs '}'
	| Vars1

Forall::=
	  forall ForallSig '.'
	| forall ForallSig '.' '{' Constraints '}' "=>"

Constraints::=
	  Constraint ',' Constraints
	| Constraint

TypeScheme::=
	  Type
	| Forall Type
	| '{' Constraints '}' "=>" Type

VarSigs::=
	  VarSig ',' VarSigs
	| VarSig

VarSig::=
	  Vars1 ':' Kind
	| Vars1

Vars1::=
	  VAR
	| VAR Vars1

Hint::=
	  '-' VAR
	| '-' VAR INT

Hints::=
	  Hint
	| Hint Hints

Kind::=
	  Type

Type::=
	  '(' VAR ':' Type ')' "->" Type
	| '(' VAR ':' Type ')' '%' Coeffect "->" Type
	| TyJuxt
	| '!' TyAtom
	| '*' TyAtom
	| Type "->" Type
	| Type '%' Coeffect "->" Type
	| Type "×" Type
	| Type '&' Type
	| TyAtom '[' Coeffect ']'
	| TyAtom "*{" Guarantee '}'
	| TyAtom '[' ']'
	| TyAtom '<' Effect '>'
	| case Type of TyCases
	| exists '{' VAR ':' Type '}' '.' Type

TyJuxt::=
	  TyJuxt '`' TyAtom '`'
	| TyJuxt TyAtom
	| TyAtom
	| TyAtom '+' TyAtom
	| TyAtom '-' TyAtom
	| TyAtom '*' TyAtom
	| TyAtom '^' TyAtom
	| TyAtom "/\\" TyAtom
	| TyAtom "\\/" TyAtom
	| TyAtom "<=" TyAtom
	| TyAtom '.' "<=" TyAtom
	| TyAtom ">=" TyAtom
	| TyAtom '.' ">=" TyAtom
	| TyAtom "==" TyAtom
	| TyAtom "/=" TyAtom
	| TyAtom "=>" TyAtom

TyCases::=
	  TyCase TyCasesNext

TyCasesNext::=
	  ';' TyCases
	| /*%empty*/

TyCase::=
	  Type "->" Type

Constraint::=
	  TyJuxt TyAtom
	| TyAtom '>' TyAtom
	| TyAtom '<' TyAtom
	| TyAtom "<=" TyAtom
	| TyAtom '.' "<=" TyAtom
	| TyAtom ">=" TyAtom
	| TyAtom '.' ">=" TyAtom
	| TyAtom "==" TyAtom
	| TyAtom "/=" TyAtom
	| TyAtom "=>" TyAtom
	| TyAtom "⨱" TyAtom

TyAtom::=
	  CONSTR
	| '(' ',' ')'
	| VAR
	| INT
	| FLOAT
	| '(' Type ')'
	| '(' Type ',' Type ')'
	| TyAtom ':' Kind
	| '{' CoeffSet '}'
	| '{' CoeffSet '}' '.'

TyParams::=
	  TyAtom TyParams
	| /*%empty*/

Coeffect::=
	  INT
	| '.' INT
	| "∞"
	| FLOAT
	| CONSTR
	| VAR
	| Coeffect ".." Coeffect
	| Coeffect '+' Coeffect
	| Coeffect '*' Coeffect
	| Coeffect '-' Coeffect
	| Coeffect '^' Coeffect
	| Coeffect "/\\" Coeffect
	| Coeffect "\\/" Coeffect
	| '(' Coeffect ')'
	| '{' CoeffSet '}'
	| '{' CoeffSet '}' '.'
	| Coeffect ':' Kind
	| '(' Coeffect ',' ',' Coeffect ')'
	| '(' Coeffect "×" Coeffect ')'

CoeffSet::=
	  CoeffSetElems
	| /*%empty*/

CoeffSetElems::=
	  CoeffSetElem ',' CoeffSetElems
	| CoeffSetElem

CoeffSetElem::=
	  CONSTR
	| VAR

Effect::=
	  '{' EffSet '}'
	| /*%empty*/
	| TyJuxt

EffSet::=
	  Eff ',' EffSet
	| Eff

Eff::=
	  CONSTR

Guarantee::=
	  CONSTR

Expr::=
	  let LetBind MultiLet
	| "\\" '(' PAtom ':' Type ')' "->" Expr
	| "\\" PAtom "->" Expr
	| let LetBindEff MultiLetEff
	| try Expr as '[' PAtom ']' in Expr catch Expr
	| try Expr as '[' PAtom ']' ':' Type in Expr catch Expr
	| case Expr of Cases
	| if Expr then Expr else Expr
	| clone Expr as CopyBind in Expr
	| endorse Expr as CopyBind in Expr
	| pack '<' Type ',' Atom '>' as exists '{' VAR ':' Type '}' '.' Type
	| unpack '<' VAR ',' VAR '>' '=' Expr in Expr
	| Form

LetBind::=
	  PAtom ':' Type '=' Expr
	| PAtom '=' Expr
	| NAryConstr ':' Type '=' Expr
	| NAryConstr '=' Expr

CopyBind::=
	  PAtom ':' Type
	| PAtom

MultiLet::=
	  ';' LetBind MultiLet
	| in Expr

LetBindEff::=
	  PAtom "<-" Expr
	| PAtom ':' Type "<-" Expr

MultiLetEff::=
	  ';' LetBindEff MultiLetEff
	| in Expr

Cases::=
	  Case CasesNext

CasesNext::=
	  ';' Cases
	| /*%empty*/

Case::=
	  PAtom "->" Expr
	| NAryConstr "->" Expr

Form::=
	  Form '+' Form
	| Form '-' Form
	| Form '*' Form
	| Form '/' Form
	| Form '<' Form
	| Form '>' Form
	| Form "<=" Form
	| Form ">=" Form
	| Form "==" Form
	| Form "/=" Form
	| Form "∘" Form
	| Form '.' Form
	| Juxt

Juxt::=
	  Juxt '`' Atom '`'
	| Juxt Atom
	| Atom
	| Juxt '@' TyAtom

Hole::=
	  "{!" Vars1 "!}"
	| "{!" Hints "!}"
	| "{!" Hints Vars1 "!}"
	| "{!" Vars1 Hints "!}"
	| "{!" "!}"
	| '?'

Atom::=
	  '(' Expr ')'
	| INT
	| FLOAT
	| VAR
	| '[' Expr ']'
	| '#' INT
	| '#' FLOAT
	| CONSTR
	| '#' CONSTR
	| '(' Expr ',' Expr ')'
	| CHAR
	| STRING
	| '#' CHAR
	| '#' STRING
	| Hole
	| share Expr

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions