LingDong- / wax

A tiny programming language that transpiles to C, C++, Java, TypeScript, Python, C#, Swift, Lua and WebAssembly 🚀
https://waxc.netlify.app/
MIT License
793 stars 45 forks source link

Railroad grammar diagram #12

Open mingodad opened 3 years ago

mingodad commented 3 years ago

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- commented 3 years ago

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")