diff options
author | Juan J. Martinez <jjm@usebox.net> | 2022-07-18 07:45:58 +0100 |
---|---|---|
committer | Juan J. Martinez <jjm@usebox.net> | 2022-07-18 07:45:58 +0100 |
commit | 8bb321f8b032dfaeffbe3d1b8dfeb215c12d3642 (patch) | |
tree | c53977d1284347bb1d5963ddb4dc7723c40c6e55 /grammar.md | |
download | micro-lang-8bb321f8b032dfaeffbe3d1b8dfeb215c12d3642.tar.gz micro-lang-8bb321f8b032dfaeffbe3d1b8dfeb215c12d3642.zip |
First public release
Diffstat (limited to 'grammar.md')
-rw-r--r-- | grammar.md | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/grammar.md b/grammar.md new file mode 100644 index 0000000..b51adb4 --- /dev/null +++ b/grammar.md @@ -0,0 +1,65 @@ + program = statement* EOF ; + + statement = expr ";" + | definition + | block + | "if" expr block ( "else" block )? + | "for" ( expr? | IDENTIFIER "in" expr ) block + | "return" "!?"? expr? ";" + | "continue" ";" + | "break" ";" + | declaration ; + + definition = "def" IDENTIFIER struct_block + | "def" IDENTIFIER "(" params? ")" TYPE? block + + params = param ( "," param )* ; + param = IDENTIFIER TYPE ; + + block = "{" statement* "}" ; + + struct_block = "{" ( definitions | declaration )+ "}" ; + + expr = assignment ; + + declaration = "const" IDENTIFIER TYPE = expr_list ";" + | "var" IDENTIFIER TYPE ( "=" expr_list )? ";" ; + + expr_list = expr + | "[" expr ( "," expr )? "]" + + assignment = INDENTIFIER ( "[" expr "]" )* "=" expr + | logic_or ; + + logic_or = logic_and ( "||" logic_and )* ; + logic_and = equality ( "&&" equality )* ; + equality = comparison ( ( "!=" | "==" ) comparison )* ; + comparison = bitterm ( ( ">" | ">=" | "<" | "<=" ) bitterm )* ; + bitterm = term ( ( "<<" | ">>" | "|" | "^" ) term )* ; + term = bitfactor ( ( "-" | "+" ) bitfactor )* ; + bitfactor = factor ( "&" factor )* ; + factor = unary ( ( "/" | "*" | "%" ) unary )* ; + + unary = ( "?" | "!" | "-" | "~" ) unary | call ; + call = primary ( "(" arguments? ")" | "." IDENTIFIER )* + | primary ( "[" expr "]" )+ ; + primary = NUMBER | STRING | FUNC | "true" | "false" + | "(" expr ")" + | IDENTIFIER ; + + arguments = expr ( "," expr )* ; + + NUMBER = ( "0x" HEX_DIGIT+ | "0b" BIN_DIGIT+ | DIGIT+ ) + | "'" CHAR "'"; + STRING = "\"" ( "\\\"" | <not "\""> )* "\"" ; + FUNC = IDENTIFIER ; + IDENTIFIER = ALPHA ( ALPHA | DIGIT )* ; + TYPE = NON_ARRAY_TYPE | ARRAY_TYPE + NON_ARRAY_TYPE = "number" | "bool" | "string" | FUNC_TYPE + FUNC_TYPE = "func" "(" ( TYPE ( "," TYPE )* )? ")" TYPE? + ARRAY_TYPE = "[" expr "]" NON_ARRAY_TYPE + ALPHA = "a" ... "z" | "A" ... "Z" | "_" ; + ALPHA_DIGIT = "0" ... "9" | "a" ... "f" | "A" ... "F" ; + BIN_DIGIT = "0" | "1" ; + DIGIT = "0" ... "9" ; + |