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

Railroad grammar diagram #12

Open
mingodad opened this issue Dec 29, 2020 · 1 comment
Open

Railroad grammar diagram #12

mingodad opened this issue Dec 29, 2020 · 1 comment

Comments

@mingodad
Copy link
Contributor

Playing around with https://www.bottlecaps.de/rr/ui I've got the beginning of an EBNF wax grammar to produce a railroad diagram, paste the EBNF show bellow in Edit Grammar then switch to tab View Diagram.

program  ::=
	comments
	| expression
	| preprocessor

expression ::=
	atom
	| list

atom ::=
	builtin
	| operator
	| keyword
	| name
	| number
	| string

list     ::= '(' expression+ ')'

keyword  ::=
	'asm'
	| 'call'
	| 'do'
	| 'else'
	| 'extern'
	| 'for'
	| 'func'
	| 'if'
	| 'let'
	| 'local'
	| 'main'
	| 'param'
	| 'result'
	| 'return'
	| 'then'
	| 'while'

types ::=
	'arr'
	| 'float'
	| 'int'
	| 'map'
	| 'str'
	| 'struct'
	| 'vec'

builtin  ::=
	'alloc'
	| 'cast'
	| 'free'
	| 'get'
	| 'insert'
	| 'print'
	| 'remove'
	| 'set'
	| 'slice'

preprocessor
         ::= '@' ( 'define' | 'if' | 'include' | 'pragma' )

operator ::= ( '+' | '-' | '*' | '\' | '#' | '&&' | '||' | '?' | ':' | '=' | '<>' | '<' | '<=' | '>' | '>=' | '<<' | '>>' | '^' | '%' | '&' | '|' | '!' | '~' )?

number   ::= [0-9]+

comments ::= ';;' [^\n]*
@LingDong-
Copy link
Owner

Cool! Thanks for sharing. I was actually working on a grammar for wax too, in BNF, it isn't quite polished yet so I haven't put it in the repo. Seems working in that tool too!

/* WAX BNF (SUBSET, WIP) */

prgm   ::= stmt | stmt prgm | comment | comment prgm
expr   ::= atom | type | stmt | comment
stmt   ::= (begin op end) | (begin op space params end)
params ::= expr | expr space params
atom   ::= ident | int | float | str

/* symbols */
lparen ::= "(" | "[" | "{"
rparen ::= ")" | "]" | "}"
begin  ::= (space lparen space) | (lparen space) | (space lparen) | lparen
end    ::= (space rparen space) | (rparen space) | (space rparen) | rparen
space  ::= (" " | "\t" | "\n") | ((" " | "\t" | "\n") space)

/* keywords */
op ::= "return" | "result" | "struct" | "insert" | "remove" | "extern" | 
         "param" | "local" | "while" | "alloc" | "slice" | "print" | "break" | 
         "func" | "then" | "else" | "call" | "cast" | "free" | "null" | 
         "get" | "set" | "let" | "for" | "asm" | 
         "if" | "do" | "<<" | ">>" | "=" | "&&" | "||" | ">=" | "<=" | "<>" | "??" | 
         "+" | "-" | "*" | "/" | "^" | "%" | "&" | "|" | "!" | "~" | "<" | ">" | "#" | "?"

/* types */
type     ::= primtype | arrtype | maptype
primtype ::= "int" | "float" | "str"
vectype  ::= begin "vec" space int space type end
arrtype  ::= begin "arr" space type end
maptype  ::= begin "map" space primtype space type end

/* charset, numbers etc */
ident   ::= letter | letter alphanum
quote   ::= "''"
digit   ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
numint  ::= digit | digit numint
negint  ::= "-" numint
chrint  ::= "'" char "'"
int     ::= chrint | numint | negint
smpflt  ::= numint "." numint
sciflt  ::= smpflt | smpflt "e" ( negint | numint )
float   ::= "-" sciflt | sciflt
letter  ::= "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" 
            | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" 
            | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d" | "e" | "f" 
            | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" 
            | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "_"
char    ::= letter | "[" | "]" | "{" | "}" | "(" | ")" | "<" | ">" 
                      | "'" | "`" | "=" | "|" | "." | "," | ";" | " "
                      | "$" | "#" | "@" | "?" | "!" | ":" | "~" | "-"
                      | "^" | "/" | "+" | " " 
                      /* etc.... */
alphanum ::= (letter | digit) | ((letter | digit) alphanum)
chars    ::= char | char chars
str      ::= (quote quote) | (quote chars quote)
comment  ::= ";\n" | (";" chars "\n")

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

2 participants