# Conlang Expression Grammar Start = Expr # literal Literal = String | Char | Float | Int | Bool String = STRING Float = FLOAT Char = CHARACTER Bool = "true" | "false" Int = INTEGER Identifier = IDENTIFIER # Expressions Expr = Flow | Ignore Block = '{' Expr '}' Group = '(' Expr ')' Final = Identifier | Literal | Block | Group | Branch # expression::math Ignore = Assign (IgnoreOp Assign )* Assign = Compare (AssignOp Compare)* Compare = Logic (CompareOp Logic )* Logic = Bitwise (LogicOp Bitwise)* Bitwise = Shift (BitwiseOp Shift )* Shift = Term (ShiftOp Term )* Term = Factor (TermOp Factor )* Factor = Unary (FactorOp Unary )* Unary = (UnaryOp)* Final # expression::math::operator IgnoreOp = ';' CompareOp = '<' | "<=" | "==" | "!=" | ">=" | '>' AssignOp = '=' | "+=" | "-=" | "*=" | "/=" | "&=" | "|=" | "^=" |"<<=" |">>=" LogicOp = "&&" | "||" | "^^" BitwiseOp = '&' | '|' | '^' ShiftOp = "<<" | ">>" TermOp = '+' | '-' FactorOp = '*' | '/' | '%' UnaryOp = '*' | '&' | '-' | '!' # expression::control Branch = While | If | For If = "if" Expr Block (Else)? While = "while" Expr Block (Else)? For = "for" Identifier "in" Expr Block (Else)? Else = "else" Block Flow = Break | Return | Continue Break = "break" Expr Return = "return" Expr Continue = "continue"