formal BNF/EBNF grammar specification for Verse?

Update: since I seem to have little respect for my free time, I decided to go about it anyway while we wait for an official and complete one:

here’s super preliminary attempt: sharing it here in case it helps :

(* Enea's Unofficial EBNF Grammar for Verse - v30*)

(* Terminals *)
identifier = letter, { letter | digit | "_" } ;
integer = digit, { digit } ;
float = integer, ".", integer ;
string = "\"", { character }, "\"" ;

(* Non-Terminals *)
program = { import_statement | class_definition | function_definition | variable_declaration } ;

import_statement = "using", "{", identifier, { ",", identifier }, "}" ;

class_definition = identifier, ":=", "class", [ "<", class_specifier, ">" ], ":", class_body ;
class_specifier = "public" | "private" | "protected" | "internal" | "concrete" | "final" | "persistable" | "unique" ;
class_body = { variable_declaration | function_definition | constructor_definition | block_expression } ;

function_definition = identifier, "(", [ parameter_list ], ")", [ "<", function_specifier, ">" ], ":", type, "=", function_body ;
function_specifier = "suspends" | "transacts" | "decides" | "converges" | "override" ;
parameter_list = parameter, { ",", parameter } ;
parameter = identifier, ":", type ;
type = "void" | "int" | "float" | "string" | "bool" | "array", "<", type, ">" | "map", "<", type, ",", type, ">" | identifier ;

variable_declaration = ["var"], identifier, ":", type, ["=", expression] ;

constructor_definition = identifier, "(", [ parameter_list ], "):", class_body ;

block_expression = "block", ":", { statement } ;

statement = variable_declaration | assignment | function_call | if_statement | loop_statement | defer_statement | await_statement ;

assignment = identifier, "=", expression ;
function_call = identifier, "(", [ argument_list ], ")" ;
argument_list = expression, { ",", expression } ;

if_statement = "if", "(", expression, ")", block_expression ;
loop_statement = "loop", ":", block_expression ;
defer_statement = "defer", ":", block_expression ;
await_statement = "await", "(", expression, ")" ;

expression = literal | identifier | function_call | binary_expression | unary_expression ;
literal = integer | float | string | "true" | "false" ;
binary_expression = expression, binary_operator, expression ;
unary_expression = unary_operator, expression ;
binary_operator = "+" | "-" | "*" | "/" | "=" | "<>" | "<" | ">" | "<=" | ">=" ;
unary_operator = "-" | "not" ;

(* Comments *)
comment = "#", { character } ;
1 Like