56 lines
1.5 KiB
EBNF
56 lines
1.5 KiB
EBNF
# 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"
|