MEMBERDECL -> ... | PREDICATE | VIEW STMT -> ... | foreach (FORMULA) { STMT* } | if ( FORMULA ) { STMT* } else { STMT* } | switch ( EXPR ) { CASES } | COND COND -> cond { [(FORMULA) { STMT* }]* [default { STMT* }] } CASES -> case PATTERN : STMT* break; CASES | default: STMT* | PREDICATE -> [DIRECTION DIRECTIONS] predicate ID( FORMALS ) { FORMULA } VIEW -> view T[.ID]( FORMALS ) { ASSIGNMENT* } ASSIGNMENT -> ID = ID; DIRECTIONS -> ; DIRECTION DIRECTIONS | DIRECTION -> IDS -> OPTBANG ID IDS IDS -> , ID IDS | OPTBANG -> ! | PATTERN -> ID[int ID] | T | T(PATARGS) | T.ID(PATARGS) PATARGS -> PATARGS, PATARGS | T ID | * | PATTERN | CONSTANT | METHOD_CALL | ID FORMULA -> [FSTMT (; FSTMT)* ;] FEXPR (type of FEXPR is boolean) FSTMT -> FEXPR | T ID [= FEXPR] | ID = FEXPR FEXPR -> constant | ID | ID(ARGS) <-- predicate or method | FEXPR BIN_OP FEXPR | UNARY_OP FEXPR | CONSTRUCTOR