From 8ab9959b149c79f38662d720ab960233489a59f5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:54:20 +0000 Subject: [PATCH 1/2] Initial plan From 0c442036dd9bcfe307aadf7e0e562918bd595f53 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:02:56 +0000 Subject: [PATCH 2/2] Add grammar.ebnf: EBNF grammar derived from parser.cpp Co-authored-by: Gogo64pro <96884572+Gogo64pro@users.noreply.github.com> --- grammar.ebnf | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 grammar.ebnf diff --git a/grammar.ebnf b/grammar.ebnf new file mode 100644 index 0000000..dc3bcb1 --- /dev/null +++ b/grammar.ebnf @@ -0,0 +1,220 @@ +(* Zenith Language EBNF Grammar *) +(* Rule names correspond to Parser method names in src/parser/parser.cpp *) + + +(* ===== Program Entry Point ===== *) + +parse = { parseAnnotations topLevelDecl } ; + +topLevelDecl = parseImport + | parseTemplate + | parseObject + | parseUnion + | parseFunction + | parseVarDecl + | parseActorDecl ; + + +(* ===== Imports ===== *) + +parseImport = "import" ( "java" IDENTIFIER { "." IDENTIFIER } + | STRING_LIT + | IDENTIFIER { "." IDENTIFIER } ) + [ ";" ] ; + + +(* ===== Variable Declarations ===== *) + +parseVarDecl = [ "hoist" ] + ( ( builtInType | IDENTIFIER ) IDENTIFIER [ "[" parseExpression "]" ] + | ( "let" | "var" | "dynamic" ) IDENTIFIER [ "[" parseExpression "]" ] [ ":" parseType ] ) + [ "=" parseExpression ] ; + + +(* ===== Types ===== *) + +parseType = builtInType + | "[" parseType "]" + | IDENTIFIER [ "<" parseType { "," parseType } ">" ] ; + +builtInType = "int" | "long" | "short" | "byte" | "float" | "double" + | "string" | "Number" | "BigInt" | "BigNumber" | "freeobj" + | "bool" | "void" ; + + +(* ===== Expressions ===== *) + +parseExpression = ( "++" | "--" ) parseExpression + | parsePrimary ( "++" | "--" ) + | parsePrimary { binaryOp parseExpression } ; + +binaryOp = "=" | "+=" | "-=" | "*=" | "/=" | "%=" + | "||" | "&&" + | "!=" | "==" + | "<" | "<=" | ">" | ">=" + | "+" | "-" | "*" | "/" | "%" ; + + +(* ===== Primary Expressions ===== *) + +parsePrimary = parseNewExpression + | INTEGER + | FLOAT_LIT + | STRING_LIT + | "true" | "false" + | "null" + | parseStructInitializer + | parseFreeObject + | "freeobj" parseFreeObject + | parseArrowFunction + | "(" parseExpression ")" + | ( IDENTIFIER | "this" ) { parseFunctionCall | parseMemberAccess | parseArrayAccess } ; + + +(* ===== New Expression ===== *) + +parseNewExpression = "new" IDENTIFIER "(" [ parseExpression { "," parseExpression } ] ")" ; + + +(* ===== Postfix / Call Operations ===== *) + +parseFunctionCall = "(" [ parseExpression { "," parseExpression } ] ")" ; + +parseMemberAccess = "." IDENTIFIER [ parseFunctionCall ] { "." IDENTIFIER [ parseFunctionCall ] } ; + +parseArrayAccess = "[" parseExpression "]" { "[" parseExpression "]" } ; + + +(* ===== Functions ===== *) + +parseFunction = ( "fun" [ parseType ] | parseType ) IDENTIFIER parseParameters + [ "->" parseType ] parseBlock ; + +parseParameters = "(" ( "{" [ param { "," param } ] "}" ")" + | [ param { "," param } ] ")" ) ; + +param = ( parseType | "let" | "var" | "dynamic" ) IDENTIFIER ; + + +(* ===== Blocks and Statements ===== *) + +parseBlock = "{" { parseStatement } "}" ; + +parseStatement = parseVarDecl + | parseIfStmt + | parseForStmt + | parseWhileStmt + | parseDoWhileStmt + | parseReturnStmt + | "unsafe" parseUnsafeBlock + | parseScopeBlock + | parseBlock + | parseExpression [ ";" ] + | ";" ; + +parseIfStmt = "if" "(" parseExpression ")" parseStatement + [ "else" parseStatement ] ; + +parseForStmt = "for" "(" ( ";" | parseVarDecl | parseExpression ) ";" + [ parseExpression ] ";" + [ parseExpression ] ")" + parseStatement ; + +parseWhileStmt = "while" "(" parseExpression ")" parseStatement ; + +parseDoWhileStmt = "do" parseStatement "while" "(" parseExpression ")" [ ";" ] ; + +parseReturnStmt = "return" [ parseExpression ] [ ";" ] ; + +parseScopeBlock = "scope" "{" { parseStatement } "}" ; + +parseUnsafeBlock = "{" { parseStatement } "}" ; + + +(* ===== Objects / Classes / Structs ===== *) + +parseObject = ( "class" | "struct" ) IDENTIFIER [ ":" IDENTIFIER ] + "{" { parseAnnotations parseObjectPrimary } "}" ; + +parseObjectPrimary = [ accessModifier ] [ "const" ] + ( parseConstructor | parseFunction | parseField ) ; + +accessModifier = "public" | "protected" | "private" | "privatew" | "protectedw" ; + +parseField = parseVarDecl ";" ; + +parseConstructor = IDENTIFIER parseParameters + [ ":" IDENTIFIER "(" parseExpression ")" + { "," IDENTIFIER "(" parseExpression ")" } ] + parseBlock ; + + +(* ===== Free Objects ===== *) + +parseFreeObject = "{" [ IDENTIFIER ":" parseExpression + { "," IDENTIFIER ":" parseExpression } ] "}" ; + + +(* ===== Struct Initializers ===== *) + +parseStructInitializer = "{" [ structField { "," structField } ] "}" ; + +structField = "." IDENTIFIER "=" parseExpression (* C-style: .field = value *) + | IDENTIFIER ":" parseExpression (* JS-style: field: value *) + | parseExpression ; (* positional *) + + +(* ===== Arrow Functions ===== *) + +parseArrowFunctionParams = "(" [ IDENTIFIER { "," IDENTIFIER } ] ")" ; + +parseArrowFunction = parseArrowFunctionParams "=>" ( parseExpression | parseBlock ) ; + + +(* ===== Unions ===== *) + +parseUnion = "union" IDENTIFIER "{" parseType { "," parseType } "}" ; + + +(* ===== Actors ===== *) + +parseActorDecl = "actor" IDENTIFIER [ ":" IDENTIFIER ] + "{" { parseMessageHandler | ( parseAnnotations parseObjectPrimary ) } "}" ; + +parseMessageHandler = "on" IDENTIFIER parseParameters [ "->" parseType ] parseBlock ; + + +(* ===== Templates ===== *) + +parseTemplate = "template" "<" parseTemplateParameters ">" + ( parseObject | parseFunction | parseUnion | parseActorDecl ) ; + +parseTemplateParameters = parseTemplateParameter { "," parseTemplateParameter } ; + +parseTemplateParameter = [ "..." ] "typename" [ "..." ] IDENTIFIER [ "=" parseType ] + | [ "..." ] parseType IDENTIFIER [ "=" parsePrimary ] ; + + +(* ===== Annotations ===== *) + +parseAnnotations = { parseAnnotation } ; + +parseAnnotation = "@" IDENTIFIER [ "(" [ annotationArg { "," annotationArg } ] ")" ] ; + +annotationArg = [ IDENTIFIER "=" ] parseExpression ; + + +(* ===== Terminals ===== *) + +IDENTIFIER = letter { letter | digit } ; +INTEGER = digit { digit } ; +FLOAT_LIT = digit { digit } "." digit { digit } ; +STRING_LIT = '"' { character } '"' ; + +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" + | "_" ; +digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; +character = ? any character except '"' and newline ? ;