THE JOA LANGUAGE

Grammar Summary

Explore the Joa grammar, including statements, declarations, expressions, literals, and operator parsing.

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)*