Nullable nonterminals: (arg_list | arg_list_rest | concept_list_rest | equation_rest | exp_concat | exp_concat_or_where | exp_var_or_func | pat_concat | pattern_list_rest | program_rest | varassign_rest | variable_dec_rest | variable_list_rest) The starters of nonterminals: program -> (DEC) program_rest -> (DEC) function_dec -> (DEC) var_dec_and_func_def -> (DEF | VAR) variable_dec -> (VAR) vars_decl -> (IDENTIFIER) variable_dec_rest -> (IDENTIFIER) variable_list -> (IDENTIFIER) variable_list_rest -> (COMMA) definition -> (DEF) equation -> (IDENTIFIER) equation_rest -> (IDENTIFIER) pattern_list -> (IDENTIFIER | STRING) pattern -> (IDENTIFIER | STRING) pat_concat -> (CONCAT) pattern_list_rest -> (COMMA) function_type -> (IDENTIFIER) concept_list_rest -> (ASTERISK) concept_name -> (IDENTIFIER) funname -> (IDENTIFIER) variable -> (IDENTIFIER) exp -> (IDENTIFIER | IF | LPAR | STRING) exp_with_where -> (IDENTIFIER | IF | LPAR | STRING) exp_with_where_or_undef -> (IDENTIFIER | IF | LPAR | STRING | UNDEFINED) exp_var_or_func -> (LPAR) arg_list -> (IDENTIFIER | IF | LPAR | STRING) arg_list_rest -> (COMMA) exp_concat -> (CONCAT) exp_concat_or_where -> (CONCAT | WHERE) varassign_list -> (IDENTIFIER) varassign_rest -> (COMMA) The followers of nullable nonterminals: program_rest -> ($END) variable_dec_rest -> (DEF) variable_list_rest -> (COLON) equation_rest -> ($END | DEC) pat_concat -> (COMMA | RPAR) pattern_list_rest -> (RPAR) concept_list_rest -> (TO) exp_var_or_func -> (COMMA | CONCAT | ELSE | RPAR | SC | THEN | WHERE) arg_list -> (RPAR) arg_list_rest -> (RPAR) exp_concat -> (COMMA | ELSE | RPAR | SC | THEN) exp_concat_or_where -> (ELSE | RPAR | SC | THEN) varassign_rest -> (ELSE | RPAR | SC | THEN) *** Annotated grammar *** program : (DEC) function_dec var_dec_and_func_def #program_rest ; #program_rest : ($END) /* empty */ | (DEC) program ; function_dec : (DEC) DEC funname COLON function_type SC ; var_dec_and_func_def : (VAR) variable_dec definition | (DEF) definition ; variable_dec : (VAR) VAR vars_decl #variable_dec_rest ; vars_decl : (IDENTIFIER) variable_list COLON concept_name SC ; #variable_dec_rest : (DEF) /* empty */ | (IDENTIFIER) vars_decl #variable_dec_rest ; variable_list : (IDENTIFIER) variable #variable_list_rest ; #variable_list_rest : (COLON) /* empty */ | (COMMA) COMMA variable #variable_list_rest ; definition : (DEF) DEF equation #equation_rest ; equation : (IDENTIFIER) funname LPAR pattern_list RPAR EQ exp_with_where_or_undef SC ; #equation_rest : ($END | DEC) /* empty */ | (IDENTIFIER) equation #equation_rest ; pattern_list : (IDENTIFIER | STRING) pattern #pattern_list_rest ; pattern : (STRING) STRING #pat_concat | (IDENTIFIER) variable #pat_concat ; #pat_concat : (COMMA | RPAR) /* empty */ | (CONCAT) CONCAT pattern ; #pattern_list_rest : (RPAR) /* empty */ | (COMMA) COMMA pattern #pattern_list_rest ; function_type : (IDENTIFIER) concept_name #concept_list_rest TO concept_name ; #concept_list_rest : (TO) /* empty */ | (ASTERISK) ASTERISK concept_name #concept_list_rest ; concept_name : (IDENTIFIER) IDENTIFIER ; funname : (IDENTIFIER) IDENTIFIER ; variable : (IDENTIFIER) IDENTIFIER ; exp : (STRING) STRING #exp_concat | (IDENTIFIER) IDENTIFIER #exp_var_or_func #exp_concat | (LPAR) LPAR exp_with_where RPAR #exp_concat | (IF) IF exp THEN exp ELSE exp ; exp_with_where : (STRING) STRING #exp_concat_or_where | (IDENTIFIER) IDENTIFIER #exp_var_or_func #exp_concat_or_where | (LPAR) LPAR exp_with_where RPAR #exp_concat_or_where | (IF) IF exp_with_where THEN exp_with_where ELSE exp_with_where ; exp_with_where_or_undef : (UNDEFINED) UNDEFINED | (IDENTIFIER | IF | LPAR | STRING) exp_with_where ; #exp_var_or_func : (COMMA | CONCAT | ELSE | RPAR | SC | THEN | WHERE) /* empty */ | (LPAR) LPAR #arg_list RPAR ; #arg_list : (RPAR) /* empty */ | (IDENTIFIER | IF | LPAR | STRING) exp #arg_list_rest ; #arg_list_rest : (RPAR) /* empty */ | (COMMA) COMMA exp #arg_list_rest ; #exp_concat : (COMMA | ELSE | RPAR | SC | THEN) /* empty */ | (CONCAT) CONCAT exp ; #exp_concat_or_where : (ELSE | RPAR | SC | THEN) /* empty */ | (CONCAT) CONCAT exp_with_where | (WHERE) WHERE varassign_list ; varassign_list : (IDENTIFIER) variable EQ exp #varassign_rest ; #varassign_rest : (ELSE | RPAR | SC | THEN) /* empty */ | (COMMA) COMMA varassign_list ;