program -> statement* EOF ; statement -> if_stmt | print_stmt | while_stmt | for_stmt | declaration | block | expr_stmt | break | return_stmt ; if_stmt -> "if" "(" expression ")" statement ( "else" statement )? ; print_stmt -> "print" expression ";" ; while_stmt -> "while" "(" expression ")" statement ; for_stmt -> "for" "(" (declaration | expr_stmt | ";") ";" expression? ";" expression ";" ")" statement ; declaration -> var_decl | fun_decl ; block -> "{" statement* "}" ; expr_Stmt -> expression ";" ; break -> "break" ";" ; return -> "return" expression? ";" ; var_decl -> "var" IDENTIFIER ( "=" expression )? ";" fun_decl -> "fun" IDENTIFIER "(" parameters ")" block ; expression -> assignment assignment -> IDENTIFIER "=" assignment | logic_or ; logic_or -> logic_and ( "or" logic_and )* ; logic_and -> equality ( "and" equality )* ; equality -> comparison ( ( "==" | "!=" ) comparison )* ; comparison -> term ( ">" | ">=" | "<" | "<=" term )* ; term -> factor ( ( "+" | "-" ) factor )* factor -> unary ( ( "*" | "/" ) unary )* ; unary -> ( "!" | "-" ) unary | call ; call -> primary ( "(" arguments? ")" )* ; arguments -> expression ( "," expression )* ; primary -> "(" expression ")" | IDENTIFIER | fun_expr | NUMBER | STRING | "true" | "false" | "nil" ; fun_expr -> "fun" "(" parameters ")" block ; parameters -> ( IDENTIFIER ( "," IDENTIFIER )* )? ;