Conlang/grammar.ebnf

56 lines
1.5 KiB
EBNF
Raw Normal View History

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