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 } ;