program → statement* EOF
statement → let_stmt
| assign_stmt
| aug_assign_stmt
| index_assign_stmt
| fn_decl
| agent_decl
| return_stmt
| break_stmt
| continue_stmt
| if_stmt
| while_stmt
| for_stmt
| expr_stmt
let_stmt → "let" IDENT (":" IDENT)? "=" expression
assign_stmt → IDENT "=" expression
aug_assign_stmt → IDENT ("+=" | "-=" | "*=" | "/=") expression
index_assign_stmt → postfix "[" expression "]" "=" expression
fn_decl → "fn" IDENT "(" params? ")" block
agent_decl → "agent" IDENT "{" (IDENT ":" expression ","?)* "}"
return_stmt → "return" expression?
break_stmt → "break"
continue_stmt → "continue"
if_stmt → "if" expression block ("else" ("if" expression block)* ("else" block)?)?
while_stmt → "while" expression block
for_stmt → "for" IDENT "in" expression block
expr_stmt → expression
block → "{" statement* "}"
params → IDENT ("," IDENT)*
expression → or_expr
or_expr → and_expr ("or" and_expr)*
and_expr → not_expr ("and" not_expr)*
not_expr → "not" not_expr | comparison
comparison → add_sub (("==" | "!=" | "<" | "<=" | ">" | ">="
| "~" | "in" | "not" "in") add_sub)*
add_sub → mul_div (("+" | "-") mul_div)*
mul_div → power (("*" | "/" | "%") power)*
power → unary ("**" power)? // right-associative
unary → "-" unary | postfix
postfix → primary (("." IDENT ("(" args? ")")?
| "[" expression "]"
| "(" args? ")"))*
primary → INT | FLOAT | STRING | BOOL | NULL | IP | SUBNET
| IDENT | "(" expression ")" | list_literal | map_literal
list_literal → "[" (expression ("," expression)*)? "]"
map_literal → "{" (map_pair ("," map_pair)*)? "}"
map_pair → (IDENT | STRING | INT) ":" expression
args → (IDENT ":")? expression ("," (IDENT ":")? expression)*
THE JOA LANGUAGE
Grammar Summary
Explore the Joa grammar, including statements, declarations, expressions, literals, and operator parsing.
Help make these docs better.Edit this page ↗