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 #204

Open
mingodad opened this issue Aug 20, 2021 · 0 comments
Open

Grammar railroad diagram #204

mingodad opened this issue Aug 20, 2021 · 0 comments

Comments

@mingodad
Copy link

Using this tool https://www.bottlecaps.de/convert/ and manually adding the tokens we can have a railroad diagram for the grammar at parse/gram.y.

Copy and paste the converted grammar shown bellow in https://www.bottlecaps.de/rr/ui on the TAB Edit Grammar then switch to the TAB View Diagram.

/*
From https://github.com/oridb/mc/blob/master/parse/gram.y
*/

/* converted on Fri Aug 20, 2021, 08:34 (UTC+02) by bison-to-w3c v0.53 which is Copyright (c) 2011-2021 by Gunther Rademacher <[email protected]> */

file     ::= toplev ( Tendln toplev )*
toplev   ::= ( package | use | implstmt | traitdef | tydef | decl )?
decl     ::= attrs ( Tvar | Tconst | Tgeneric ) decllist traitspec
attrs    ::= Tattr*
traitspec
         ::= ( Twith traitvar ( listsep traitvar )* )?
traitvar ::= traitlist generictype ( Tret type )?
traitlist
         ::= name ( listsep name )*
decllist ::= declbody ( listsep declbody )*
use      ::= Tuse ( Tident | Tstrlit )
optident ::= Tident?
package  ::= Tpkg optident Tasn pkgitem ( Tendln pkgitem )* Tendblk
pkgitem  ::= ( decl | pkgtydef | traitdef | implstmt )?
pkgtydef ::= attrs tydef
declbody ::= declcore ( Tasn expr )?
declcore ::= name
           | typedeclcore
typedeclcore
         ::= name? Tcolon type
name     ::= Tident ( Tdot Tident )?
implstmt ::= Timpl name type optauxtypes traitspec ( Tasn Tendln optendlns ( Tident Tasn exprln optendlns )* Tendblk )?
traitdef ::= Ttrait Tident generictype optauxtypes traitspec ( Tasn optendlns ( Tident Tcolon type optendlns )* Tendblk )?
optauxtypes
         ::= ( Tret typelist )?
tydef    ::= Ttype typeid traitspec ( Tasn type )?
typeid   ::= Tident ( Toparen generictype ( listsep generictype )* Tcparen )?
type     ::= structdef
           | tupledef
           | uniondef
           | compoundtype
           | generictype
           | Tellipsis
generictype
         ::= Ttyparam
compoundtype
         ::= functype
           | type ( Tosqbrac ( Tcolon | expr | Tellipsis ) Tcsqbrac | Tderef )
           | name ( Toparen typelist Tcparen )?
           | Tvoidlit
functype ::= Toparen funcsig Tcparen
funcsig  ::= typedeclcore? ( listsep typedeclcore )* Tret type
tupledef ::= Toparen typelist Tcparen
typelist ::= type ( listsep type )*
structdef
         ::= Tstruct structent+ Tendblk
structent
         ::= declcore? Tendln
uniondef ::= Tunion unionelt+ Tendblk
unionelt ::= ( Ttick name type? )? Tendln
goto     ::= Tgoto Tident
retexpr  ::= Tret? expr
optexpr  ::= expr?
loopcond ::= exprln
           | Tendln
optexprln
         ::= exprln
           | Tendln
exprln   ::= expr Tendln
expr     ::= ternexpr ( asnop ternexpr )*
asnop    ::= Tasn
           | Taddeq
           | Tsubeq
           | Tmuleq
           | Tdiveq
           | Tmodeq
           | Tboreq
           | Tbxoreq
           | Tbandeq
           | Tbsleq
           | Tbsreq
ternexpr ::= lorexpr ( Tqmark lorexpr Tcolon lorexpr )?
lorexpr  ::= landexpr ( Tlor landexpr )*
landexpr ::= cmpexpr ( Tland cmpexpr )*
cmpexpr  ::= borexpr ( cmpop borexpr )*
cmpop    ::= Teq
           | Tgt
           | Tlt
           | Tge
           | Tle
           | Tne
borexpr  ::= bandexpr ( ( Tbor | Tbxor ) bandexpr )*
bandexpr ::= addexpr ( Tband addexpr )*
addexpr  ::= mulexpr ( addop mulexpr )*
addop    ::= Tplus
           | Tminus
mulexpr  ::= shiftexpr ( mulop shiftexpr )*
mulop    ::= Tmul
           | Tdiv
           | Tmod
shiftexpr
         ::= prefixexpr ( shiftop prefixexpr )*
shiftop  ::= Tbsl
           | Tbsr
prefixexpr
         ::= ( Tauto | Tinc | Tdec | Tband | Tlnot | Tbnot | Tminus | Tplus | Ttick name )* ( Ttick name | atomicexpr ( Tdot ( Tident | Tintlit ) | Tinc | Tdec | Tosqbrac ( expr | optexpr Tcolon optexpr ) Tcsqbrac | Tderef | Toparen expr? ( listsep expr )* Tcparen )* )
atomicexpr
         ::= Tident
           | Tgap
           | literal
           | ( Toparen expr ( Tcolon type )? | ( Tsizeof Toparen | Timpl Toparen name listsep ) type ) Tcparen
tupbody  ::= tuphead expr? ( listsep expr )*
tuphead  ::= expr listsep
literal  ::= funclit
           | littok
           | seqlit
           | tuplit
tuplit   ::= Toparen tupbody Tcparen
littok   ::= Tstrlit+
           | Tchrlit
           | Tfloatlit
           | Tboollit
           | Tvoidlit
           | Tintlit
obrace   ::= Tobrace
funclit  ::= obrace params ( Tret type )? traitspec Tendln blkbody Tcbrace
params   ::= fnparam? ( listsep fnparam )*
fnparam  ::= declcore
           | Tgap ( Tcolon type )?
seqlit   ::= Tosqbrac optendlns ( arrayelt ( listsep arrayelt )* | structelt ( listsep structelt )* )? optcomma Tcsqbrac
arrayelt ::= ( Tdot Tosqbrac expr Tcsqbrac Tasn )? expr optendlns
structelt
         ::= Tdot Tident Tasn expr optendlns
listsep  ::= Tcomma optendlns
optcomma ::= ( Tcomma optendlns )?
optendlns
         ::= Tendln*
stmt     ::= ( goto | break | continue | retexpr | label | ifstmt | forstmt | whilestmt | matchstmt )?
break    ::= Tbreak
continue ::= Tcontinue
forstmt  ::= Tfor ( ( optexprln | decl Tendln ) loopcond optexprln | expr Tcolon exprln ) block
whilestmt
         ::= Twhile exprln block
ifstmt   ::= Tif exprln blkbody ( Telif exprln blkbody )* ( Telse block | Tendblk )
matchstmt
         ::= Tmatch exprln optendlns ( Tbor match )+ Tendblk
match    ::= expr Tcolon blkbody Tendln
block    ::= blkbody Tendblk
blkbody  ::= ( decl | stmt | tydef ) ( Tendln ( stmt | decl | tydef ) )*
label    ::= Tcolon Tident

// Tokens

Tplus ::= "+"
Tminus ::= "-"
Tmul ::= "*"
Tdiv ::= "/"
Tinc ::= "++"
Tdec ::= "--"
Tmod ::= "%"
Tasn ::= "="
Taddeq ::= "+="
Tsubeq ::= "-="
Tmuleq ::= "*="
Tdiveq ::= "/="
Tmodeq ::= "%="
Tboreq ::= "|="
Tbxoreq ::= "^="
Tbandeq ::= "&="
Tbsleq ::= "<<="
Tbsreq ::= ">>="

Tbor ::= "|"
Tbxor ::= "^"
Tband ::= "&"
Tbsl ::= "<<"
Tbsr ::= ">>"
Tbnot ::= "~"

Teq ::= "=="
Tgt ::= ">"
Tlt ::= "<"
Tge ::= ">="
Tle ::= "<="
Tne ::= "!="

Tlor ::= "||"
Tland ::= "&&"
Tlnot ::= "!"

Tobrace ::= "{"
Tcbrace ::= "}"
Toparen ::= "("
Tcparen ::= ")"
Tosqbrac ::= "["
Tcsqbrac ::= "]"
Ttick ::= "`"
Tderef ::= "#"
Tqmark ::= "?"

Ttype ::= "type"
Tfor ::= "for"
Twhile ::= "while"
Tif ::= "if"
Telse ::= "else"
Telif ::= "else"
Tmatch ::= "match"
Tgoto ::= "goto"
Tbreak ::= "break"
Tcontinue ::= "continue"
Tauto ::= "auto"


Ttrait ::= "trait"
//%token<tok> Timpl	/* trait */
Tstruct ::= "struct"
Tunion ::= "union"
Ttyparam ::= "@typename"

Tconst ::= "const"
Tvar ::= "var"
Tgeneric ::= "generic"

Tgap ::= "_"
Tellipsis ::= "..."
Tendln ::= ";"
Tendblk ::= ";;"
Tcolon ::= ":"
Twith ::= "::"
Tdot ::= "."
Tcomma ::= ","
Tret ::= "->"
Tuse ::= "use"
Tpkg ::= "pkg"
Tattr ::= "$attr"
Tsizeof ::= "sizeof"
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