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"
|