Conlang/grammar.ebnf
John b1f90ca4e9 conlang: Add statements
TODO: Parse `let` statements
2023-10-26 14:33:56 -05:00

59 lines
1.8 KiB
EBNF

(* Conlang Expression Grammar *)
Start = Program ;
Program = Stmt* EOI ;
(* literal *)
Literal = STRING | CHARACTER | FLOAT | INTEGER | Bool ;
Bool = "true" | "false" ;
Identifier = IDENTIFIER ;
(* # Statements *)
(* statement *)
Stmt = Fn | Let | Expr ';' ;
Let = "let" "mut"? Identifier (':' Type)? ('=' Expr)? ';' ;
Fn = "fn" Identifier Block ; (* TODO: params, return value*)
(* # Expressions *)
(* expression *)
Expr = Ignore ;
Block = '{' Expr '}' ;
Group = '(' Expr? ')' ;
Primary = Item | Identifier | Literal
| Block | Group | Branch ;
(* expression::math *)
Ignore = Assign (IgnoreOp Assign )* ;
Assign = Compare (AssignOp Compare)* ;
Compare = Range (CompareOp Range )* ;
Range = Logic (RangeOp Logic )* ;
Logic = Bitwise (LogicOp Bitwise)* ;
Bitwise = Shift (BitwiseOp Shift )* ;
Shift = Term (ShiftOp Term )* ;
Term = Factor (TermOp Factor )* ;
Factor = Unary (FactorOp Unary )* ;
Unary = (UnaryOp)* Primary ;
(* expression::math::operator *)
IgnoreOp = ';' ;
AssignOp = '=' | "+=" | "-=" | "*=" | "/=" |
"&=" | "|=" | "^=" |"<<=" |">>=" ;
CompareOp = '<' | "<=" | "==" | "!=" | ">=" | '>' ;
RangeOp = ".." | "..=" ;
LogicOp = "&&" | "||" | "^^" ;
BitwiseOp = '&' | '|' | '^' ;
ShiftOp = "<<" | ">>";
TermOp = '+' | '-' ;
FactorOp = '*' | '/' | '%' ;
UnaryOp = '*' | '&' | '-' | '!' ;
(* expression::control *)
Branch = While | If | For | Break | Return | Continue ;
If = "if" Expr Block (Else)? ;
While = "while" Expr Block (Else)? ;
For = "for" Identifier "in" Expr Block (Else)? ;
Else = "else" Block ;
Break = "break" Expr ;
Return = "return" Expr ;
Continue = "continue" ;