program: extrn_and_start local_def_list compound_stmnt local_def_list: /* empty */ | local_def local_def_list extrn_and_start: TK_WORD_VOID TK_WORD_MAIN TK_PAR_OPEN TK_PAR_CLOSE | func_prot extrn_and_start local_def: func_prot | func_def | var_def func_prot: func_header TK_EROTIM func_def: func_header local_def_list compound_stmnt func_header: data_type TK_IDENT TK_PAR_OPEN maybe_formal TK_PAR_CLOSE | TK_WORD_VOID TK_IDENT TK_PAR_OPEN maybe_formal TK_PAR_CLOSE maybe_formal: /* empty */ | formal_param | formal_param TK_COMMA maybe_formal formal_param: data_type TK_IDENT | data_type TK_IDENT TK_AGK_OPEN TK_AGK_CLOSE | data_type TK_AMPERSAND TK_IDENT | data_type TK_AMPERSAND TK_IDENT TK_AGK_OPEN TK_AGK_CLOSE data_type: TK_WORD_INTEGER | TK_WORD_CHAR var_def: data_type def_var_list TK_EROTIM def_var_list: def_one_var | def_one_array | def_one_var TK_COMMA def_var_list | def_one_array TK_COMMA def_var_list def_one_var: TK_IDENT def_one_array: TK_IDENT TK_AGK_OPEN TK_INT TK_AGK_CLOSE statement: l_value TK_ASSIGN expression TK_EROTIM | TK_WORD_IF TK_PAR_OPEN b_expression TK_PAR_CLOSE statement if_tail | TK_WORD_WHILE TK_PAR_OPEN b_expression TK_PAR_CLOSE statement | void_func_call | return_stmnt | TK_AGKISTRO_OPEN stmnt_list TK_AGKISTRO_CLOSE | TK_EROTIM A: // empty l_value: TK_IDENT | TK_IDENT TK_AGK_OPEN A expression TK_AGK_CLOSE if_tail: /* empty */ | TK_WORD_ELSE statement void_func_call: func_call TK_EROTIM func_call: TK_IDENT TK_PAR_OPEN actual_param_l TK_PAR_CLOSE actual_param_l: /* empty */ | actual_param | actual_param TK_COMMA actual_param_l actual_param: pure_expr | TK_IDENT | TK_IDENT TK_AGK_OPEN A expression TK_AGK_CLOSE | TK_STRING return_stmnt: TK_WORD_RETURN return_stmnt_queue return_stmnt_queue:TK_EROTIM {/* acceptable for all types */} | expression TK_EROTIM compound_stmnt: TK_AGKISTRO_OPEN stmnt_list TK_AGKISTRO_CLOSE ; stmnt_list: /* empty */ | stmnt_list_ne stmnt_list_ne: statement | statement stmnt_list_ne b_expression: b_expression TK_OP_AND b_expression | b_expression TK_OP_OR b_expression | TK_OP_NOT b_expression | TK_PAR_OPEN b_expression TK_PAR_CLOSE | expression TK_OP_EQUAL expression | expression TK_OP_NOTEQUAL expression | expression TK_OP_GREATER expression | expression TK_OP_LESS expression | expression TK_OP_GREATEREQ expression | expression TK_OP_LESSEQ expression expression: pure_expr | l_value pure_expr: expression TK_OP_PLUS expression | expression TK_OP_MINUS expression | expression TK_OP_MULT expression | expression TK_OP_DIV expression | expression TK_OP_MOD expression | TK_OP_PLUS expression | TK_OP_MINUS expression | TK_INT | TK_CHAR | func_call | TK_PAR_OPEN expression TK_PAR_CLOSE