object_allocation ::= "new" ( identifier "(" expression_list ")" ["{" expression_list "}"] | "{" assignment_list "}" agent_allocation ::= "create" identifier "(" expression_list ")" ["at" expression] belief_expr ::= "belief" ( belief_query_expr | belief_remove_expr | belief_add_expr ) ( "join" belief_expr "on" expression ["as" belief_projection] ["where" expression] )* belief_add_expr ::= "fact" expression belief_projection ::= identifier [ "{" identifier_list "}" ] belief_query_expr ::= "query" class_signature ["as" belief_projection ["where" expression] ] belief_remove_expr ::= "remove" class_signature [ "as" belief_projection ["where" expression] ] class_signature ::= string_literal stop_eval_expr ::= "@" "{" expression "}" u_expr ::= primary | "-" u_expr | "+" u_expr | "!" u_expr | "~" u_expr | object_allocation | agent_allocation | belief_expr | stop_eval_expr primary ::= atom trailer* atom ::= literal | identifier | "(" expression ")" trailer ::= "(" expression_list ")" | "[" expression "]" | "." identifier expression ::= assignment_expression assignment_expression ::= (primary assignment_operator)* or_test assignment_operator ::= "=" | "+=" | "-=" | "*=" | "/=" | ..... (same as other language) or_test ::= and_test ( "||" and_test)* and_test ::= bo_expr ("&&" bo_expr)* bo_expr ::= bx_expr ( "|" bx_expr)* (bit or) bx_expr ::= ba_expr ("^" ba_expr)* (bit xor) ba_expr ::= comparison ("&" comparison)* (bit and) comparison ::= s_expr (comp_operator s_expr)* comp_operator ::= ">" | "<" | "!=" | ">=" | "<=" | "==" s_expr ::= a_expr ( ( ">>" | "<<" ) a_expr )* (shift expression) a_expr ::= m_expr (("+" | "-") m_expr)* m_expr ::= u_expr (("*" | "/") u_expr)* expression_stmt ::= expression ";" | ";" statement ::= expression_stmt | if_stmt | while_stmt | for_stmt | do_while_stmt | foreach_stmt | continue_stmt | break_stmt | return_stmt | label_decl_stmt | switch_stmt | stmt_block | match_stmt if_stmt ::= "if" "(" expression ")" statement ["else" statement] while_stmt ::= "while" "(" expression ")" statement for_stmt ::= "for" "(" expression_list ";" expression_list ";" expression_list ")" statement do_while_stmt ::= "do" statement "while" "(" expression ")" ";" foreach_stmt ::= "foreach" "(" identifier "in" expression ")" statement continue_stmt ::= "continue" ";" break_stmt ::= "break" ";" return_stmt ::= "return" [expression] ";" label_decl_stmt ::= identifier ":" switch_stmt ::= "switch" "(" expression ")" "{" (label_decl_stmt | statement)* "}" match_stmt ::= "match" "(" expression ")" "with" "{" regex_expr_list "->" statement ( "|" regex_expr_list "->" statement )* "}" regex_expr_list ::= "*" | expression ["+" | "?" | "*"] ("," expression ["+" | "?" | "*"])* translation_unit ::= include_stmt* (class_decl_stmt | agent_class_decl_stmt)* include_stmt ::= "include" string_literal ";" class_decl_stmt ::= access_type "class" identifier "extends" "{" identifier_list "}" "{" (method_decl_stmt | member_var_decl_stmt)* "}" agent_class_decl_stmt ::= access_type "class" identifier "extends" "{" identifier_list "}" "{" (method_decl_stmt | member_var_decl_stmt | plan_decl_stmt)* "}" access_type ::= "public" | "protected" | "private" member_var_decl_stmt ::= access_type ["static"] identifier [ "=" expression] ( "," identifier ["=" expression])* ";" method_decl_stmt ::= access_type ["static"] "function" identifier "(" identifier_list ")" stmt_block stmt_block ::= "{" statement* "}" plan_decl_stmt ::= access_type "plan" identifier "(" identifier_list ")" stmt_block identifier_list ::= | identifier ("," identifier)* expression_list ::= | expression ("," expression)* file_input ::= translation_unit