/* translation of file(s)
	"abs.k"
	"main.k"
	"parse.k"
	"error.k"
	"occur.k"
	"util.k"
	"gen.k"
	"gutil.k"
	"pat.k"
 */
/* generated by:
 *  @(#)$Author$
 */
#define KC_UNPARSE

#include <stdio.h>
#include <string>
#include <stdlib.h>
#include "k.h"
#include "unpk.h"


namespace kc {
base_uview_class base_uview;
view_filename_class view_filename;
view_error_class view_error;
view_error_tID_class view_error_tID;
view_check_class view_check;
view_check_count_class view_check_count;
view_check_count1_class view_check_count1;
view_check_outmostopers_in_phylum_class view_check_outmostopers_in_phylum;
view_set_type_class view_set_type;
view_check_is_var_class view_check_is_var;
view_gen_initializephyla_c_class view_gen_initializephyla_c;
view_check_u_class view_check_u;
view_check_r_class view_check_r;
view_check_viewnames_class view_check_viewnames;
view_check_uniq_class view_check_uniq;
view_check_uniq1_class view_check_uniq1;
view_check_uniq2_class view_check_uniq2;
view_make_patternreps_class view_make_patternreps;
view_printer_outputfileline_class view_printer_outputfileline;
view_printer_reset_class view_printer_reset;
view_no_of_printed_string_chars_reset_class view_no_of_printed_string_chars_reset;
view_open_namespace_class view_open_namespace;
view_close_namespace_class view_close_namespace;
view_gen_k_h_class view_gen_k_h;
view_gen_end_k_h_class view_gen_end_k_h;
view_gen_k_c_class view_gen_k_c;
view_gen_alloc_h_class view_gen_alloc_h;
view_gen_alloc_c_class view_gen_alloc_c;
view_gen_deprecated_class view_gen_deprecated;
view_gen_enumphyla_h_class view_gen_enumphyla_h;
view_gen_enumoperators_h_class view_gen_enumoperators_h;
view_gen_operatormap_type_h_class view_gen_operatormap_type_h;
view_gen_phylummap_c_class view_gen_phylummap_c;
view_gen_operatormap_c_class view_gen_operatormap_c;
view_count_args_class view_count_args;
view_count_attrs_class view_count_attrs;
view_count_nonstaticmembers_class view_count_nonstaticmembers;
view_gen_operatormap_subphyla_class view_gen_operatormap_subphyla;
view_gen_operatormap_attributes_class view_gen_operatormap_attributes;
view_gen_uniqmap_c_class view_gen_uniqmap_c;
view_gen_uniqmap_c_1_class view_gen_uniqmap_c_1;
view_gen_uniqmap_c_2_class view_gen_uniqmap_c_2;
view_gen_nodetypedefs_h_class view_gen_nodetypedefs_h;
view_gen_nodetypes_h_class view_gen_nodetypes_h;
view_gen_yaccstacktype_h_class view_gen_yaccstacktype_h;
view_gen_noofoperators_h_class view_gen_noofoperators_h;
view_gen_assertmacros_h_class view_gen_assertmacros_h;
view_gen_assertmacros_c_class view_gen_assertmacros_c;
view_gen_operatordecls_h_class view_gen_operatordecls_h;
view_gen_operatorcast_h_class view_gen_operatorcast_h;
view_gen_operatordefs_c_class view_gen_operatordefs_c;
view_gen_operatordefs_c_0_class view_gen_operatordefs_c_0;
view_gen_operatordefs_c_1_class view_gen_operatordefs_c_1;
view_gen_operatordefs_c_2_class view_gen_operatordefs_c_2;
view_gen_initializephyla_whiletest_c_class view_gen_initializephyla_whiletest_c;
view_gen_initializephyla_init_el_c_class view_gen_initializephyla_init_el_c;
view_gen_initializephyla_update_loop_c_class view_gen_initializephyla_update_loop_c;
view_gen_operatordefs_nonhash_c_class view_gen_operatordefs_nonhash_c;
view_gen_operatordefs_hash_c_class view_gen_operatordefs_hash_c;
view_gen_access_functions_class view_gen_access_functions;
view_gen_create_function_class view_gen_create_function;
view_gen_attributeOf_function_class view_gen_attributeOf_function;
view_gen_argseqnr_class view_gen_argseqnr;
view_gen_fnarg_asserts_class view_gen_fnarg_asserts;
view_gen_fnarg_and_decls_class view_gen_fnarg_and_decls;
view_gen_fnarg_and_decls_predef_class view_gen_fnarg_and_decls_predef;
view_gen_assignments_class view_gen_assignments;
view_gen_assignment_inis_class view_gen_assignment_inis;
view_gen_user_assignment_inis_class view_gen_user_assignment_inis;
view_gen_assignments_predef_class view_gen_assignments_predef;
view_gen_assignments_predef_ini_class view_gen_assignments_predef_ini;
view_gen_test_class view_gen_test;
view_gen_error_decls_h_class view_gen_error_decls_h;
view_gen_error_defs_c_class view_gen_error_defs_c;
view_gen_printdotdecls_h_class view_gen_printdotdecls_h;
view_gen_printdotdefs_c_class view_gen_printdotdefs_c;
view_gen_printdotedges_c_class view_gen_printdotedges_c;
view_gen_listdecls_h_class view_gen_listdecls_h;
view_gen_listdefs_c_class view_gen_listdefs_c;
view_gen_includes_class view_gen_includes;
view_do_gen_includes_class view_do_gen_includes;
view_gen_csgio_start_h_class view_gen_csgio_start_h;
view_gen_csgio_end_h_class view_gen_csgio_end_h;
view_gen_csgio_h_class view_gen_csgio_h;
view_gen_csgio_start_c_class view_gen_csgio_start_c;
view_gen_csgio_c_class view_gen_csgio_c;
view_gen_copy_attributes_c_class view_gen_copy_attributes_c;
view_gen_copydefs_c_class view_gen_copydefs_c;
view_gen_rewritek_h_class view_gen_rewritek_h;
view_gen_end_rewritek_h_class view_gen_end_rewritek_h;
view_gen_rewritek_c_class view_gen_rewritek_c;
view_gen_rewritedefs_c_class view_gen_rewritedefs_c;
view_gen_rewritedefs_default_c_class view_gen_rewritedefs_default_c;
view_gen_rewritedefs_other_c_class view_gen_rewritedefs_other_c;
view_gen_rewritedefs_rewritearg_c_class view_gen_rewritedefs_rewritearg_c;
view_gen_rewritedefs_nl_arg_c_class view_gen_rewritedefs_nl_arg_c;
view_gen_rewritedefs_testarg_c_class view_gen_rewritedefs_testarg_c;
view_gen_rewritedefs_dotestarg_c_class view_gen_rewritedefs_dotestarg_c;
view_gen_rewritedefs_args_c_class view_gen_rewritedefs_args_c;
view_gen_rewritedefs_body_c_class view_gen_rewritedefs_body_c;
view_gen_withcases_and_default_class view_gen_withcases_and_default;
view_rw_predicates_class view_rw_predicates;
view_wc_predicates_class view_wc_predicates;
view_unp_predicates_class view_unp_predicates;
view_wc_bindings_class view_wc_bindings;
view_unp_bindings_class view_unp_bindings;
view_rw_bindings_class view_rw_bindings;
view_gen_fnk_h_class view_gen_fnk_h;
view_gen_fnkdecls_c_class view_gen_fnkdecls_c;
view_gen_fnk_c_class view_gen_fnk_c;
view_gen_fn_pointer_name_class view_gen_fn_pointer_name;
view_gen_fnkargs_class view_gen_fnkargs;
view_gen_fnkdecls_class view_gen_fnkdecls;
view_gen_fns_start_h_class view_gen_fns_start_h;
view_gen_fns_end_h_class view_gen_fns_end_h;
view_gen_fns_start_c_class view_gen_fns_start_c;
view_gen_fns_owninclude_c_class view_gen_fns_owninclude_c;
view_gen_unpk_h_class view_gen_unpk_h;
view_gen_unparsedecls_h_class view_gen_unparsedecls_h;
view_gen_rewritedecls_h_class view_gen_rewritedecls_h;
view_uview_def_class view_uview_def;
view_gen_end_unpk_h_class view_gen_end_unpk_h;
view_gen_unpk_c_class view_gen_unpk_c;
view_gen_default_types_unpk_c_class view_gen_default_types_unpk_c;
view_gen_unparsedefs_c_class view_gen_unparsedefs_c;
view_gen_unparsedefs_other_c_class view_gen_unparsedefs_other_c;
view_gen_unpstr_c_class view_gen_unpstr_c;
view_gen_user_predicates_class view_gen_user_predicates;
view_predicate_bindings_class view_predicate_bindings;
view_checklanguagenames_class view_checklanguagenames;
view_output_collection_class view_output_collection;
view_gen_classdecls1_h_class view_gen_classdecls1_h;
view_gen_classdecls2_h_class view_gen_classdecls2_h;
view_gen_classdefs_c_class view_gen_classdefs_c;
view_gen_subphylumdefs_c_class view_gen_subphylumdefs_c;
view_gen_cast_class view_gen_cast;
view_gen_hashtables_h_class view_gen_hashtables_h;
view_gen_hashtables_c_class view_gen_hashtables_c;
view_gen_yxx_union_h_class view_gen_yxx_union_h;
view_gen_member_dcl_h_class view_gen_member_dcl_h;
view_gen_set_subphylumdefs_c_class view_gen_set_subphylumdefs_c;
view_gen_viewvars_c_class view_gen_viewvars_c;
view_gen_argseqnr_rec_class view_gen_argseqnr_rec;
view_gen_opt_const_class view_gen_opt_const;
view_uview_class_decl_class view_uview_class_decl;
view_uview_class_def_class view_uview_class_def;
view_rview_class_decl_class view_rview_class_decl;
view_rview_class_def_class view_rview_class_def;
view_collect_strings_class view_collect_strings;
view_class_of_op_class view_class_of_op;
view_class_of_phy_class view_class_of_phy;

impl_uviews uviews[] = {
    {"base_uview",&base_uview},
    {"view_error_format", 0},
    {"view_filename",&view_filename},
    {"view_error",&view_error},
    {"view_error_tID",&view_error_tID},
    {"view_check",&view_check},
    {"view_check_count",&view_check_count},
    {"view_check_count1",&view_check_count1},
    {"view_check_outmostopers_in_phylum",&view_check_outmostopers_in_phylum},
    {"view_set_type",&view_set_type},
    {"view_check_is_var",&view_check_is_var},
    {"view_gen_initializephyla_c",&view_gen_initializephyla_c},
    {"view_check_u",&view_check_u},
    {"view_check_r",&view_check_r},
    {"view_check_viewnames",&view_check_viewnames},
    {"view_check_uniq",&view_check_uniq},
    {"view_check_uniq1",&view_check_uniq1},
    {"view_check_uniq2",&view_check_uniq2},
    {"view_make_patternreps",&view_make_patternreps},
    {"view_printer_outputfileline",&view_printer_outputfileline},
    {"view_printer_reset",&view_printer_reset},
    {"view_no_of_printed_string_chars_reset",&view_no_of_printed_string_chars_reset},
    {"view_open_namespace",&view_open_namespace},
    {"view_close_namespace",&view_close_namespace},
    {"view_gen_k_h",&view_gen_k_h},
    {"view_gen_end_k_h",&view_gen_end_k_h},
    {"view_gen_k_c",&view_gen_k_c},
    {"view_gen_alloc_h",&view_gen_alloc_h},
    {"view_gen_alloc_c",&view_gen_alloc_c},
    {"view_gen_deprecated",&view_gen_deprecated},
    {"view_gen_enumphyla_h",&view_gen_enumphyla_h},
    {"view_gen_enumoperators_h",&view_gen_enumoperators_h},
    {"view_gen_operatormap_type_h",&view_gen_operatormap_type_h},
    {"view_gen_phylummap_c",&view_gen_phylummap_c},
    {"view_gen_operatormap_c",&view_gen_operatormap_c},
    {"view_count_args",&view_count_args},
    {"view_count_attrs",&view_count_attrs},
    {"view_count_nonstaticmembers",&view_count_nonstaticmembers},
    {"view_gen_operatormap_subphyla",&view_gen_operatormap_subphyla},
    {"view_gen_operatormap_attributes",&view_gen_operatormap_attributes},
    {"view_gen_uniqmap_c",&view_gen_uniqmap_c},
    {"view_gen_uniqmap_c_1",&view_gen_uniqmap_c_1},
    {"view_gen_uniqmap_c_2",&view_gen_uniqmap_c_2},
    {"view_gen_nodetypedefs_h",&view_gen_nodetypedefs_h},
    {"view_gen_nodetypes_h",&view_gen_nodetypes_h},
    {"view_gen_yaccstacktype_h",&view_gen_yaccstacktype_h},
    {"view_gen_noofoperators_h",&view_gen_noofoperators_h},
    {"view_gen_assertmacros_h",&view_gen_assertmacros_h},
    {"view_gen_assertmacros_c",&view_gen_assertmacros_c},
    {"view_gen_operatordecls_h",&view_gen_operatordecls_h},
    {"view_gen_operatorcast_h",&view_gen_operatorcast_h},
    {"view_gen_operatordefs_c",&view_gen_operatordefs_c},
    {"view_gen_operatordefs_c_0",&view_gen_operatordefs_c_0},
    {"view_gen_operatordefs_c_1",&view_gen_operatordefs_c_1},
    {"view_gen_operatordefs_c_2",&view_gen_operatordefs_c_2},
    {"view_gen_initializephyla_whiletest_c",&view_gen_initializephyla_whiletest_c},
    {"view_gen_initializephyla_init_el_c",&view_gen_initializephyla_init_el_c},
    {"view_gen_initializephyla_update_loop_c",&view_gen_initializephyla_update_loop_c},
    {"view_gen_operatordefs_nonhash_c",&view_gen_operatordefs_nonhash_c},
    {"view_gen_operatordefs_hash_c",&view_gen_operatordefs_hash_c},
    {"view_gen_access_functions",&view_gen_access_functions},
    {"view_gen_create_function",&view_gen_create_function},
    {"view_gen_attributeOf_function",&view_gen_attributeOf_function},
    {"view_gen_argseqnr",&view_gen_argseqnr},
    {"view_gen_fnarg_asserts",&view_gen_fnarg_asserts},
    {"view_gen_fnarg_and_decls",&view_gen_fnarg_and_decls},
    {"view_gen_fnarg_and_decls_predef",&view_gen_fnarg_and_decls_predef},
    {"view_gen_assignments",&view_gen_assignments},
    {"view_gen_assignment_inis",&view_gen_assignment_inis},
    {"view_gen_user_assignment_inis",&view_gen_user_assignment_inis},
    {"view_gen_assignments_predef",&view_gen_assignments_predef},
    {"view_gen_assignments_predef_ini",&view_gen_assignments_predef_ini},
    {"view_gen_test",&view_gen_test},
    {"view_gen_error_decls_h",&view_gen_error_decls_h},
    {"view_gen_error_defs_c",&view_gen_error_defs_c},
    {"view_gen_printdotdecls_h",&view_gen_printdotdecls_h},
    {"view_gen_printdotdefs_c",&view_gen_printdotdefs_c},
    {"view_gen_printdotedges_c",&view_gen_printdotedges_c},
    {"view_gen_listdecls_h",&view_gen_listdecls_h},
    {"view_gen_listdefs_c",&view_gen_listdefs_c},
    {"view_gen_includes",&view_gen_includes},
    {"view_do_gen_includes",&view_do_gen_includes},
    {"view_gen_csgio_start_h",&view_gen_csgio_start_h},
    {"view_gen_csgio_end_h",&view_gen_csgio_end_h},
    {"view_gen_csgio_h",&view_gen_csgio_h},
    {"view_gen_csgio_start_c",&view_gen_csgio_start_c},
    {"view_gen_csgio_c",&view_gen_csgio_c},
    {"view_gen_copy_attributes_c",&view_gen_copy_attributes_c},
    {"view_gen_copydefs_c",&view_gen_copydefs_c},
    {"view_gen_rewritek_h",&view_gen_rewritek_h},
    {"view_gen_end_rewritek_h",&view_gen_end_rewritek_h},
    {"view_gen_rewritek_c",&view_gen_rewritek_c},
    {"view_gen_rewritedefs_c",&view_gen_rewritedefs_c},
    {"view_gen_rewritedefs_default_c",&view_gen_rewritedefs_default_c},
    {"view_gen_rewritedefs_other_c",&view_gen_rewritedefs_other_c},
    {"view_gen_rewritedefs_rewritearg_c",&view_gen_rewritedefs_rewritearg_c},
    {"view_gen_rewritedefs_nl_arg_c",&view_gen_rewritedefs_nl_arg_c},
    {"view_gen_rewritedefs_testarg_c",&view_gen_rewritedefs_testarg_c},
    {"view_gen_rewritedefs_dotestarg_c",&view_gen_rewritedefs_dotestarg_c},
    {"view_gen_rewritedefs_args_c",&view_gen_rewritedefs_args_c},
    {"view_gen_rewritedefs_body_c",&view_gen_rewritedefs_body_c},
    {"view_gen_withcases_and_default",&view_gen_withcases_and_default},
    {"view_rw_predicates",&view_rw_predicates},
    {"view_wc_predicates",&view_wc_predicates},
    {"view_unp_predicates",&view_unp_predicates},
    {"view_wc_bindings",&view_wc_bindings},
    {"view_unp_bindings",&view_unp_bindings},
    {"view_rw_bindings",&view_rw_bindings},
    {"view_gen_fnk_h",&view_gen_fnk_h},
    {"view_gen_fnkdecls_c",&view_gen_fnkdecls_c},
    {"view_gen_fnk_c",&view_gen_fnk_c},
    {"view_gen_fn_pointer_name",&view_gen_fn_pointer_name},
    {"view_gen_fnkargs",&view_gen_fnkargs},
    {"view_gen_fnkdecls",&view_gen_fnkdecls},
    {"view_gen_fns_start_h",&view_gen_fns_start_h},
    {"view_gen_fns_end_h",&view_gen_fns_end_h},
    {"view_gen_fns_start_c",&view_gen_fns_start_c},
    {"view_gen_fns_owninclude_c",&view_gen_fns_owninclude_c},
    {"view_gen_unpk_h",&view_gen_unpk_h},
    {"view_gen_unparsedecls_h",&view_gen_unparsedecls_h},
    {"view_gen_rewritedecls_h",&view_gen_rewritedecls_h},
    {"view_uview_def",&view_uview_def},
    {"view_gen_end_unpk_h",&view_gen_end_unpk_h},
    {"view_gen_unpk_c",&view_gen_unpk_c},
    {"view_gen_default_types_unpk_c",&view_gen_default_types_unpk_c},
    {"view_gen_unparsedefs_c",&view_gen_unparsedefs_c},
    {"view_gen_unparsedefs_default_c", 0},
    {"view_gen_unparsedefs_other_c",&view_gen_unparsedefs_other_c},
    {"view_gen_unpstr_c",&view_gen_unpstr_c},
    {"view_gen_user_predicates",&view_gen_user_predicates},
    {"view_predicate_bindings",&view_predicate_bindings},
    {"view_checklanguagenames",&view_checklanguagenames},
    {"view_output_collection",&view_output_collection},
    {"view_gen_classdecls1_h",&view_gen_classdecls1_h},
    {"view_gen_classdecls2_h",&view_gen_classdecls2_h},
    {"view_gen_classdefs_c",&view_gen_classdefs_c},
    {"view_gen_subphylumdefs_c",&view_gen_subphylumdefs_c},
    {"view_gen_cast",&view_gen_cast},
    {"view_gen_hashtables_h",&view_gen_hashtables_h},
    {"view_gen_hashtables_c",&view_gen_hashtables_c},
    {"view_gen_yxx_union_h",&view_gen_yxx_union_h},
    {"view_gen_member_dcl_h",&view_gen_member_dcl_h},
    {"view_gen_set_subphylumdefs_c",&view_gen_set_subphylumdefs_c},
    {"view_gen_viewvars_c",&view_gen_viewvars_c},
    {"view_gen_argseqnr_rec",&view_gen_argseqnr_rec},
    {"view_gen_opt_const",&view_gen_opt_const},
    {"view_uview_class_decl",&view_uview_class_decl},
    {"view_uview_class_def",&view_uview_class_def},
    {"view_rview_class_decl",&view_rview_class_decl},
    {"view_rview_class_def",&view_rview_class_def},
    {"view_collect_strings",&view_collect_strings},
    {"view_class_of_op",&view_class_of_op},
    {"view_class_of_phy",&view_class_of_phy},
    {0,0}
};

} // namespace kc
namespace kc { }
using namespace kc;
/* included stuff */
//
// The Termprocessor Kimwitu++
//
// Copyright (C) 1991 University of Twente, Dept TIOS.
// Copyright (C) 1998-2003 Humboldt-University of Berlin, Institute of Informatics
// All rights reserved.
//
// Kimwitu++ is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// Kimwitu++ is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Kimwitu++; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

#include "util.h"
#include "occur.h"

static int cl_scope = 0;

#include <stack>
static std::stack<operators> outmostoperators;

static std::stack<dollarvarstatus> dollarvarsallowed;

static std::stack<int> inforeachcontext;

static std::stack<arguments> argumentsstack;

static std::stack<ID> phylumstack;

static std::stack<phylumnames> phylumnamesstack;

static std::stack<withexpressions> withexpressionsstack;

static std::stack<ID> operatorstack;

static std::stack<variables> variablesstack;

#include "parse.h"
static ID cl_uniqueID = 0;
static ID cl_storageID = 0;

#include "pat.h"	/* for syn_outmostpatterns and v_resetbindingidmarks */

extern unparseitems The_current_unparseitems;

#include "defs.h"

#define FMOP 38
#define FMSZ 3
#define FMNCR 8
#define FMNCRD 8
#define FMEXIST 8
#define FMFRNC 8
#define FMFRRC 8
#define FMFREED 8
#define FMREM 8
#define FMTOT 9

const char* preDefTypeAndName[][2] = { {"", ""}, {"kc_char_t const*", "name"}, {"kc_char_t const*", "name"},
    {"REAL", "value"}, {"INTEGER", "value"}, {"void*", "pointer"}};

#include "gen.h"

// Definition of the view class for view_gen_unparsedefs_default_c;
// it contains an additional var to indicate whether we are unparsing a list pylum
// and another to show whether the user has supplied rules for the base view
struct view_gen_unparsedefs_default_c_class :view_gen_unparsedefs_default_c_baseclass
{
    bool isList;
    bool isOnlyDefault;
    view_gen_unparsedefs_default_c_class(bool LonL, bool oD):
    isList(LonL), isOnlyDefault(oD) { }
};
view_gen_unparsedefs_default_c_class view_gen_unparsedefs_default_c(false, false);

// To avoid covariant return types for broken compilers, we want to have three choices:
// Use them, don't use them, generate both and decide with preprocessor macros

// extended version: typename also in function name
void
covariant_choice(ID yest, const char* yess1, const char* yess2, const char *no1, const char *no2,
    printer_functor kc_printer, uview kc_current_view)
{
    kc_printer("\n", kc_current_view);
    if (g_options.covariant == 'p') kc_printer("#ifndef NO_COVARIANT_RETURN\n", kc_current_view);
    if (g_options.covariant != 'n') {
	yest->unparse(kc_printer, kc_current_view);
	kc_printer(yess1, kc_current_view);
	if (yess2!=0) {
	    yest->unparse(kc_printer, kc_current_view);
	    kc_printer(yess2, kc_current_view);
	}
    }
    if (g_options.covariant == 'p') kc_printer("\n#else\n", kc_current_view);
    if (g_options.covariant != 'y') {
	kc_printer(no1, kc_current_view);
	if (no2!=0) {
	    yest->unparse(kc_printer, kc_current_view);
	    kc_printer(no2, kc_current_view);
	}
    }
    if (g_options.covariant == 'p') kc_printer("\n#endif // NO_COVARIANT_RETURN\n", kc_current_view);
}

// short version: typename exactly once
inline void
covariant_choice(ID yest, const char* yess, const char *no, printer_functor kc_printer, uview kc_current_view)
{ covariant_choice(yest, yess, 0, no, 0, kc_printer, kc_current_view); }

// This printer functor doesn't print, but instead counts each of
// its invocations. Handy to find out whether a future unparsing
// will produce any output at all.
class count_printer: public printer_functor_class {
    int count;
    public:
    count_printer(): count(0) { }
    virtual void operator()(const char* s, uview v) { count++;}
    int operator()() { return count;}
};


#include "gutil.h"

#include <map>
#include <string>
#include <stack>
namespace { // everything here is local to unpk.cc
    int g_no_of_phyla;
    int g_no_of_operators;
    int gl_no_of_args;
    int gl_generic_counter;
    bool gl_isnotlist;

    std::map<string, path> gl_bindings;

    const int PHYLUMNUMBEROFFSET=0; /* should be >= 0; == the index of the last dummy element */
    const int OPERATORNUMBEROFFSET=0; /* should be >= 0; == the index of the last dummy element */

    std::stack<ID> selvarstack;
#define cf_pushselvar(o) do { selvarstack.push(o); \
	g_ctext_level++; \
    } while(0)
#define cf_topselvar() selvarstack.top()
#define cf_popselvar() do { selvarstack.pop();\
	g_ctext_level--; \
    } while(0)

	std::stack<ID> dollarvarstack;
    std::stack<ID> dollarvarextstack;

    ID gl_phylum = 0;
    phylumdeclaration gl_phydecl = 0;
    ID gl_view = 0;
    ID gl_operator = 0;
    alternative gl_alternative = 0;
    Ccode_option gl_cco = 0;
    storageoption gl_storageoption = 0;
    bool gl_atomicity;
    arguments gl_args = 0;
    ac_identifier_list gl_idents = 0;
    fndeclarations gl_members = 0;
    rewriterulesinfo gl_rewrite_rewriteinfo = 0;
    const char *g_emptystring = "";
    int g_ctext_level = 0;
    int g_withexpr_nr = 0;
    int g_fe_selvar_nr = 0;
    const char *gl_return_type = "";
    ID gl_return_ID = 0;
    int gl_star_count = 0;
    const char *gl_function = "";
    ID gl_sto = 0;
    bool gl_rewrite_goto_used = false;
    bool gl_unparse_goto_used = false;
    ID gl_type = 0;
    int gl_j = 0;
    bool gl_print_line_directive = false;
    uview_enum gl_outer_view;
}


/* end included stuff */


namespace kc {

#ifndef KC_TRACE_PROVIDED
#define KC_TRACE_PROVIDED(COND,FILE,LINE,NODE) COND
#endif

void
impl_abstract_phylum::unparse(printer_function opf, uview uv)
{
    printer_functor_function_wrapper pf(opf);
    do_unparse(pf, uv);
}

// Everything given as a pointer is expected to have an unparse-method (we
// believe it's a phylum), unless there's a specialisation for it

void
unparse(abstract_phylum kc_p, printer_functor kc_printer, uview kc_current_view)
{
    kc_p->unparse(kc_printer, kc_current_view);
}

void
unparse(void *kc_p, printer_functor kc_printer, uview kc_current_view)
{
    // MPi: 20020628 there shouldn't be any left
    assertionFailed("Unparse called for untyped pointer");
    // MPi: cast should be unnecessary, but there are still void*
    reinterpret_cast<impl_abstract_phylum*>(kc_p)->unparse(kc_printer, kc_current_view);
}

void
unparse(int kc_v, printer_functor kc_printer, uview kc_current_view)
{
    kc_char kc_string[200];
    kc_print_integer(kc_string,kc_v);
    kc_printer(kc_string, kc_current_view);
}

void
unparse(double kc_v, printer_functor kc_printer, uview kc_current_view)
{
    kc_char kc_string[200];
    kc_print_real(kc_string,kc_v);
    kc_printer(kc_string, kc_current_view);
}

void
unparse(kc_char *kc_v, printer_functor kc_printer, uview kc_current_view)
{
    kc_printer(kc_v, kc_current_view);
}

void
unparse(kc_string_t kc_v, printer_functor kc_printer, uview kc_current_view)
{
    kc_printer(kc_v.c_str(), kc_current_view);
}

void
impl_abstract_phylum::default_unparse(printer_functor kc_printer, uview kc_current_view)
{
    register int no_sons = operator_info[prod_sel()].no_sons;
    for (int i=0; i < no_sons; i++)
    subphylum(i)->unparse(kc_printer, kc_current_view);
}

void
impl_casestring__Str::do_unparse(printer_functor kc_printer, uview kc_current_view)
{
    kc::unparse(name, kc_printer, kc_current_view);
}

void
impl_nocasestring_NoCaseStr::do_unparse(printer_functor kc_printer, uview kc_current_view)
{
    kc::unparse(name, kc_printer, kc_current_view);
}

void
impl_integer__Int::do_unparse(printer_functor kc_printer, uview kc_current_view)
{
    kc::unparse(value, kc_printer, kc_current_view);
}

void
impl_real__Real::do_unparse(printer_functor kc_printer, uview kc_current_view)
{
    kc::unparse(value, kc_printer, kc_current_view);
}

void
impl_voidptr__VoidPtr::do_unparse(printer_functor kc_printer, uview kc_current_view)
{
    kc::unparse(pointer, kc_printer, kc_current_view);
}


void
impl_uniqID_Str::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ID_Id::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_class_of_phy_enum: {
	    view_class_of_phy_class& kc_current_view=static_cast<view_class_of_phy_class&>(kc_current_view_base);
	    {
		const uniqID pid = this->uniqID_1;
		{ kc_printer(kc_t("impl_"), kc_current_view); }
		kc::unparse(pid, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_class_of_op_enum: {
	    view_class_of_op_class& kc_current_view=static_cast<view_class_of_op_class&>(kc_current_view_base);
	    {
		const uniqID oid = this->uniqID_1;
		ID pid=f_phylumofoperator(this);
		if (f_listelementphylum(pid)->eq(f_emptyId())) 
		{
		    kc::unparse(pid, kc_printer, view_class_of_phy);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		else 
		{
		    kc::unparse(pid, kc_printer, view_class_of_phy);
		}
	    }
	    break;
	}
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    {
		const ID id = this/**/;
		{ kc_printer(kc_t("char* kc_language_"), kc_current_view); }
		kc::unparse(id, kc_printer, base_uview);
		{ kc_printer(kc_t(" [] = {\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fn_pointer_name_enum: {
	    view_gen_fn_pointer_name_class& kc_current_view=static_cast<view_gen_fn_pointer_name_class&>(kc_current_view_base);
	    if ((this->uniqID_1->prod_sel() == sel_Str)) {
		const ID id = this/**/;
		const uniqID uniqId = this->uniqID_1;
		const casestring s = phylum_cast<const impl_uniqID_Str*>(this->uniqID_1)->casestring_1;
		if(f_ispredefinedphylum(id) && strncmp(s->name, "abstract_", 9)!=0) 
		{
		    { kc_printer(kc_t("impl_"), kc_current_view); }
		    kc::unparse(uniqId, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    UNPARSE(f_operatorofphylum(id, 1)); 
		     }
		else if(f_isphylum(id)) 
		{
		    { kc_printer(kc_t("impl_"), kc_current_view); }
		    kc::unparse(uniqId, kc_printer, kc_current_view);
		}
		else if(f_alternativeofoperator(id)) 
		{
		    UNPARSE(f_phylumofoperator(id)); 
		    	{ kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(uniqId, kc_printer, kc_current_view);
		}
		else 
		{
		    kc::unparse(uniqId, kc_printer, kc_current_view);
		}
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		const uniqID uid = this->uniqID_1;
		kc::unparse(uid->type, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(uid, kc_printer, kc_current_view);
		if (uid->line != 0) 
		{
		    { kc_printer(kc_t(" (introduced at "), kc_current_view); }
		    kc::unparse(uid->file, kc_printer, kc_current_view);
		    { kc_printer(kc_t(":"), kc_current_view); }
		    kc::unparse(uid->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(")"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const uniqID uid = this->uniqID_1;
		kc::unparse(uid, kc_printer, kc_current_view);
		if (uid->line != 0) 
		{
		    { kc_printer(kc_t(" (introduced at "), kc_current_view); }
		    kc::unparse(uid->file, kc_printer, kc_current_view);
		    { kc_printer(kc_t(":"), kc_current_view); }
		    kc::unparse(uid->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(")"), kc_current_view); }
		}
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_INT_Int::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const integer i = this->integer_1;
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_STRING_String::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_phylumdeclarationsroot_PhylumDeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_rview_class_decl_enum: {
	    view_rview_class_decl_class& kc_current_view=static_cast<view_rview_class_decl_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\ntypedef enum {\
\n"), kc_current_view); }
		kc::unparse(Therviewnames, kc_printer, view_gen_rewritek_h);
		{ kc_printer(kc_t("last_rview\
\n} rview_enum;\
\n\
\nstruct impl_rviews {\
\n    const char *name;\
\n    rview_class *view;\
\n};\
\nextern struct impl_rviews rviews[];\
\nclass "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("rview_class {\
\n\rprotected:\v\
\n    // only used in derivations\
\n    rview_class(rview_enum v): m_view(v) { }\
\n    rview_class(const rview_class&): m_view(base_rview_enum)\
\n	\v{ /* do not copy"), kc_current_view );
		  kc_printer(kc_t(" m_view */ }\r\
\n\rpublic:\v\
\n    const char* name() const\
\n	\v{ return rviews[m_view].name; }\r\
\n    operator rview_enum() const\
\n	\v{ return m_view; }\r\
\n    bool operator==(const rview_cl"), kc_current_view );
		  kc_printer(kc_t("ass& other) const\
\n	\v{ return m_view == other.m_view; }\r\
\n"), kc_current_view); }
		if(g_options.rw_loop) 
		{
		    { kc_printer(kc_t("    // Called when the rewrite_loop enters a node (just before the call\
\n    //   to do_rewrite and before entering its sons).\
\n    // The result of this function is used instead of current in the "), kc_current_view );
		  kc_printer(kc_t("rewrite process.\
\n    // If skip_current is set to true (default is false), the result is not rewritten\
\n    //   any further (neither do_rewrite() nor post_rewrite() are called).\
\n    virtual ab"), kc_current_view );
		  kc_printer(kc_t("stract_phylum pre_rewrite(abstract_phylum current, bool& /* skip_current */)\
\n	\v{ return current; }\r\
\n    // Called when the rewrite_loop leaves current node (after the call to do_rewrite).\
\n  "), kc_current_view );
		  kc_printer(kc_t("  // Current is the finally rewritten node.\
\n    // The result is used instead of the argument to build the final tree.\
\n    // If again is set to true (default is false) the result node is rewritt"), kc_current_view );
		  kc_printer(kc_t("en again.\
\n    virtual abstract_phylum post_rewrite(abstract_phylum current, bool& /* again */)\
\n	\v{ return current; }\r\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\rprivate:\v\
\n    rview_enum m_view;\
\n};\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_uview_class_decl_enum: {
	    view_uview_class_decl_class& kc_current_view=static_cast<view_uview_class_decl_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\ntypedef enum {\
\n"), kc_current_view); }
		kc::unparse(Theuviewnames, kc_printer, view_uview_def);
		{ kc_printer(kc_t(" last_uview\
\n} uview_enum;\
\n\
\nstruct impl_uviews {\
\n    const char *name;\
\n    uview_class *view;\
\n};\
\nextern impl_uviews uviews[];\
\nclass "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("uview_class {\
\n\rprotected:\v\
\n    // only used in derivations\
\n    uview_class(uview_enum v): m_view(v) { }\
\n    uview_class(c_uview): m_view(base_uview_enum)\
\n	\v{ /* do not copy m_view */ "), kc_current_view );
		  kc_printer(kc_t("}\r\
\n\rpublic:\v\
\n    const char* name() const\
\n	\v{ return uviews[m_view].name; }\r\
\n    operator uview_enum() const\
\n	\v{ return m_view; }\r\
\n    bool operator==(const uview_class& other)"), kc_current_view );
		  kc_printer(kc_t(" const\
\n	\v{ return m_view == other.m_view; }\r\
\n\rprivate:\v\
\n    uview_enum m_view;\
\n};\
\n\
\nclass "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("printer_functor_class {\
\n\rpublic:\v\
\n    virtual void operator()(const kc_char_t*, uview) { }\
\n    virtual ~printer_functor_class() { }\
\n};\
\n\
\nclass "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("printer_functor_function_wrapper : public printer_functor_class {\
\n\rpublic:\v\
\n    printer_functor_function_wrapper(const printer_function opf =0): m_old_printer(opf) { }\
\n    virtual ~printer_f"), kc_current_view );
		  kc_printer(kc_t("unctor_function_wrapper() { }\
\n    virtual void operator()(const kc_char_t* s, uview v)\
\n	\v{ if(m_old_printer) m_old_printer(s, v); }\r\
\n\rprivate:\v\
\n    printer_function m_old_printer;\
\n};"), kc_current_view );
		  kc_printer(kc_t("\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_yxx_union_h_enum: {
	    view_gen_yxx_union_h_class& kc_current_view=static_cast<view_gen_yxx_union_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("union {\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("};\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_hashtables_c_enum: {
	    view_gen_hashtables_c_class& kc_current_view=static_cast<view_gen_hashtables_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\nextern const char* kc_storageclassnames[];\
\n\
\n#ifdef KC_STATISTICS\
\nvoid do_print_operator_statistics(FILE * kc_f)\
\n{\
\n    unsigned int kc_i;\
\n    assertNonNull( kc_f );\
\n    fprintf("), kc_current_view );
		  kc_printer(kc_t("kc_f, \"%-*s| %-*s| %-*s| %-*s| %-*s| %-*s| %-*s| %-*s| %-*s| %-*s\\n\", 38 , \"Operator\", 3, \"Sz\", 8, \"#oper\", 8, \"#new\", 8, \"#exist\", 8, \"#frnrec\", 8, \"#frrec\", 8, \"#freed\", 8, \"#rem\""), kc_current_view );
		  kc_printer(kc_t(", 9, \"total (bytes)\");\
\n    fprintf(kc_f, \"%-*s|%*s |%*d |%*d |%*d |%*d |%*d |%*d |%*d |%*d\\n\", 38, \"case sensitive strings\", 3, \"-\", 8, operator_statistics[sel__Str].created, 8, operator_st"), kc_current_view );
		  kc_printer(kc_t("atistics[sel__Str].existing_not_found, 8, operator_statistics[sel__Str].created-operator_statistics[sel__Str].existing_not_found, 8, 0, 8, 0, 8, 0, 8, 0, 9, kc_casestring_strlen);\
\n    fprintf(kc_f, "), kc_current_view );
		  kc_printer(kc_t("\"%-*s|%*s |%*d |%*d |%*d |%*d |%*d |%*d |%*d |%*d\\n\", 38, \"case insensitive strings\", 3, \"-\", 8, operator_statistics[sel_NoCaseStr].created, 8, operator_statistics[sel_NoCaseStr].existing_not_fo"), kc_current_view );
		  kc_printer(kc_t("und, 8, operator_statistics[sel_NoCaseStr].created-operator_statistics[sel_NoCaseStr].existing_not_found, 8, 0, 8, 0, 8, 0, 8, 0, 9, kc_nocasestring_strlen);\
\n    for (kc_i = one_before_first_operato"), kc_current_view );
		  kc_printer(kc_t("r+1; kc_i < last_operator; kc_i++) {\
\n	fprintf(kc_f, \"%-*s|%*d |%*d |%*d |%*d |%*d |%*d |%*d |%*d |%*d\\n\", 38, operator_info[kc_i].name, 3, operator_info[kc_i].size, 8, operator_statistics[kc_i].c"), kc_current_view );
		  kc_printer(kc_t("reated, 8, operator_statistics[kc_i].existing_not_found, 8, operator_statistics[kc_i].created-operator_statistics[kc_i].existing_not_found, 8, operator_statistics[kc_i].free_called[false], 8, operator_"), kc_current_view );
		  kc_printer(kc_t("statistics[kc_i].free_called[true], 8, operator_statistics[kc_i].freed[false]+operator_statistics[kc_i].freed[true], 8, operator_statistics[kc_i].existing_not_found-(operator_statistics[kc_i].freed[fal"), kc_current_view );
		  kc_printer(kc_t("se]+operator_statistics[kc_i].freed[true]), 9, operator_info[kc_i].size*(operator_statistics[kc_i].existing_not_found-(operator_statistics[kc_i].freed[false]+operator_statistics[kc_i].freed[true])));\
\n"), kc_current_view );
		  kc_printer(kc_t("    }\
\n}\
\n#endif // KC_STATISTICS\
\n\
\n"), kc_current_view); }
		if(!g_options.no_hashtables) 
		{
		    { kc_printer(kc_t("\
\nvoid\
\nht_static(kc_storageclass_t kc_a_storageclass_t)\
\n{\
\n    hashtables[kc_a_storageclass_t]->ht_static();\
\n}\
\n\
\nvoid\
\nht_dynamic(kc_storageclass_t kc_a_storageclass_t)\
\n{\
\n    "), kc_current_view );
		  kc_printer(kc_t("hashtables[kc_a_storageclass_t]->ht_dynamic();\
\n}\
\n\
\nvoid\
\nht_inc_level(kc_storageclass_t kc_a_storageclass_t)\
\n{\
\n    hashtables[kc_a_storageclass_t]->ht_inc_level();\
\n}\
\n\
\nvoid\
\nh"), kc_current_view );
		  kc_printer(kc_t("t_dec_level(kc_storageclass_t kc_a_storageclass_t)\
\n{\
\n    hashtables[kc_a_storageclass_t]->ht_dec_level();\
\n}\
\n\
\nvoid\
\nht_free_level(kc_storageclass_t kc_a_storageclass_t)\
\n{\
\n    hash"), kc_current_view );
		  kc_printer(kc_t("tables[kc_a_storageclass_t]->ht_free_level();\
\n}\
\n\
\nhashtable_t\
\nht_create_simple()\
\n{\
\n    hashtable_t kc_ht=new hashtable_struct_t;\
\n    kc_ht->set_to_be_freed();\
\n    return kc_ht;\
\n"), kc_current_view );
		  kc_printer(kc_t("}\
\n\
\nhashtable_t\
\nht_assign(hashtable_t kc_a_hashtable_t, kc_storageclass_t kc_a_storageclass_t, bool still_unique)\
\n{\
\n    hashtable_t kc_tmp = hashtables[kc_a_storageclass_t];\
\n    hashta"), kc_current_view );
		  kc_printer(kc_t("bles[kc_a_storageclass_t] = kc_a_hashtable_t;\
\n    kc_storageclass_still_uniq[kc_a_storageclass_t] = still_unique;\
\n    return kc_tmp;\
\n}\
\n\
\nhashtable_t\
\nht_assigned(kc_storageclass_t kc_a_"), kc_current_view );
		  kc_printer(kc_t("storageclass_t)\
\n{\
\n    return hashtables[kc_a_storageclass_t];\
\n}\
\n\
\nvoid\
\nht_clear(hashtable_t kc_a_hashtable_t)\
\n{\
\n    kc_a_hashtable_t->ht_clear();\
\n}\
\n\
\nvoid\
\nht_delete(ha"), kc_current_view );
		  kc_printer(kc_t("shtable_t kc_a_hashtable_t)\
\n{\
\n    if(kc_a_hashtable_t->to_be_freed())\
\n	delete kc_a_hashtable_t;\
\n}\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_hashtables_h_enum: {
	    view_gen_hashtables_h_class& kc_current_view=static_cast<view_gen_hashtables_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\ntypedef struct {\
\n    int created;\
\n    int existing_not_found;\
\n    int free_called[2];\
\n    int freed[2];\
\n} KC_OPERATOR_STATISTICS;\
\n\
\n#ifdef KC_STATISTICS\
\n# define print_operat"), kc_current_view );
		  kc_printer(kc_t("or_statistics(kc_f) do_print_operator_statistics(kc_f)\
\n  void	do_print_operator_statistics(FILE*);\
\n#else\
\n# define print_operator_statistics(kc_f)\
\n#endif\
\n\
\ntypedef class hashtable_struc"), kc_current_view );
		  kc_printer(kc_t("t_t* hashtable_t;\
\n"), kc_current_view); }
		if(!g_options.no_hashtables) 
		{
		    { kc_printer(kc_t("void	ht_static (kc_storageclass_t);\
\nvoid	ht_dynamic (kc_storageclass_t);\
\nvoid	ht_inc_level (kc_storageclass_t);\
\nvoid	ht_dec_level (kc_storageclass_t);\
\nvoid	ht_free_level (kc_storageclass_t)"), kc_current_view );
		  kc_printer(kc_t(";\
\nhashtable_t	ht_create_simple ();\
\nhashtable_t	ht_assign (hashtable_t, kc_storageclass_t, bool still_unique=false);\
\nhashtable_t	ht_assigned (kc_storageclass_t);\
\nvoid	ht_clear (hashtable_t);"), kc_current_view );
		  kc_printer(kc_t("\
\nvoid	ht_delete (hashtable_t);\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\n//namespace Phylum {\r\
\n"), kc_current_view); }
		{ kc_printer(kc_t("\
\nclass "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("impl_abstract_phylum"), kc_current_view); }

		{
		    baseclass_list kc_selvar_0_1 = phylum_cast<baseclass_list>(The_abstract_phylum_decl->base_classes);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consbaseclass_list)) {

			PRINT("\b :\b ");
			UNPARSE(The_abstract_phylum_decl->base_classes);

		    } else
		    {

		    }
		}

		{ kc_printer(kc_t(" {\
\n\rpublic:\v\
\n    virtual enum_operators prod_sel() const =0;\
\n    static const enum_phyla phylum_sel_;\
\n    enum_phyla phylum() const;\
\n    const char* phylum_name() const;\
\n    const c"), kc_current_view );
		  kc_printer(kc_t("har* op_name() const;\
\n    virtual abstract_phylum subphylum(int) const;\
\n    virtual void set_subphylum(int, abstract_phylum);\
\n    void free(bool recursive=true);\
\n    bool eq(c_abstract_phyl"), kc_current_view );
		  kc_printer(kc_t("um) const;\
\n    void print();\
\n    void fprint(FILE *);\
\n    abstract_phylum copy(bool kc_copy_attributes) const;\n"), kc_current_view); }
		if(!g_options.no_unparse) 
		{
		    { kc_printer(kc_t("	void unparse(printer_functor pf, uview uv)\
\n	    \v{ do_unparse(pf, uv); }\r\
\n        void unparse(printer_function opf, uview uv);\n"), kc_current_view); }
		}
		if(!g_options.no_printdot) 
		{
		    { kc_printer(kc_t("\
\n	void printdot_add_edge (c_abstract_phylum, int, int*, kc_dotedgenode_t*, const char*) const;\
\n	void do_printdot_id (FILE*, bool, c_abstract_phylum, int) const;\
\n	void do_printdot (FILE*, bool,"), kc_current_view );
		  kc_printer(kc_t(" int*, kc_dotedgenode_t*, const char*, bool, bool, c_abstract_phylum, int) const;\
\n\
\n	virtual void fprintdot(FILE *,\
\n	const char *root_label_prefix, const char *edge_label_prefix, const char *ed"), kc_current_view );
		  kc_printer(kc_t("ge_attributes,\
\n	bool print_node_labels, bool use_context_when_sharing_leaves, bool print_prologue_and_epilogue) const =0;\
\n"), kc_current_view); }
		}
		if(!g_options.no_csgio) 
		{
		    { kc_printer(kc_t("	void CSGIOwrite(FILE *) const;\
\n"), kc_current_view); }
		}
		if(!g_options.no_rewrite) 
		{
		    if(!g_options.rw_loop) 
		    {
			{ kc_printer(kc_t("	virtual abstract_phylum rewrite(rview v) { return do_rewrite(v); }\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	abstract_phylum rewrite(rview v) {\
\n	    return rewrite_loop(v); }\
\n	abstract_phylum rewrite_loop(rview v);\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("	virtual abstract_phylum do_rewrite(rview) { return this;}\
\n	// called if a subphylum of an op is rewritten and a new op is created by default rule\
\n	virtual void rewrite_members(abstract_phylum fr"), kc_current_view );
		  kc_printer(kc_t("om) {} \
\n"), kc_current_view); }
		}
		if(!f_post_create_in_phylumdecl(The_abstract_phylum_decl)) 
		{
		    { kc_printer(kc_t("	virtual void post_create(){}\
\n"), kc_current_view); }
		}
		fndeclarations tapam = The_abstract_phylum_decl->additional_members; 
		kc::unparse(tapam, kc_printer, view_gen_member_dcl_h);
		kc::unparse(tapam, kc_printer, view_count_nonstaticmembers);
		if(g_options.smart_pointer) 
		{
		    if(!f_constructors_in_phylumdecl(The_abstract_phylum_decl)) 
		    {
			{ kc_printer(kc_t("	impl_abstract_phylum()"), kc_current_view); }
			if(gl_no_of_args!=0) 
			{
			    { kc_printer(kc_t(": "), kc_current_view); }
			    kc::unparse(gl_members, kc_printer, view_gen_user_assignment_inis);
			}
			{ kc_printer(kc_t("\v\
\n		{ _ref=0; }\r\
\n	    "), kc_current_view); }
		    }
		    if(!f_destructors_in_phylumdecl(The_abstract_phylum_decl)) 
		    {
			{ kc_printer(kc_t("	virtual ~impl_abstract_phylum() {\
\n	    if(_ref)\
\n		_ref->reset_phylum();\
\n	}\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("	impl_abstract_phylum(const impl_abstract_phylum&) {\
\n	    _ref=0;\
\n	}\
\n	abstract_phylum_ref* get_ref() const {\
\n	    return _ref;\
\n	}\
\n	abstract_phylum_ref* add_ref() {\
\n	    if(!_ref)\
\n"), kc_current_view );
		  kc_printer(kc_t("		_ref=new_phylum_ref();\
\n	    return _ref;\
\n	}\
\n	void set_ref(abstract_phylum_ref* r) {\
\n	    _ref=r;\
\n	}\
\n	virtual abstract_phylum_ref* new_phylum_ref()=0;\
\n	abstract_phylum return_ptr("), kc_current_view );
		  kc_printer(kc_t(") { if(get_ref()) get_ref()->lock(); return this; }\
\n\rprivate:\v\
\n	abstract_phylum_ref*_ref;\
\n"), kc_current_view); }
		}
		else 
		{
		    if (!f_constructors_in_phylumdecl(The_abstract_phylum_decl) && gl_no_of_args!=0) 
		    {
			{ kc_printer(kc_t("explicit impl_abstract_phylum()\v\n: "), kc_current_view); }
			kc::unparse(gl_members, kc_printer, view_gen_user_assignment_inis);
			{ kc_printer(kc_t(" { }\r\n"), kc_current_view); }
		    }
		    if(!f_destructors_in_phylumdecl(The_abstract_phylum_decl)) 
		    {
			{ kc_printer(kc_t("	virtual ~impl_abstract_phylum() { }\
\n"), kc_current_view); }
		    }
		}
		if(!g_options.no_unparse) 
		{
		    { kc_printer(kc_t("\rprivate:\v\
\n	virtual void do_unparse(printer_functor, uview) =0;\
\n\rprotected:\v\
\n	virtual void default_unparse(printer_functor, uview);\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("};\n\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("template <>\
\nclass phylum_ptr<impl_abstract_phylum> {\
\n\rpublic:\v\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   phylum_ptr(bool weak=false) { _ref=0; _weak=weak; }\
\n    phylum_ptr(impl_abstract_phylum* t,bool weak=false) {\
\n	_ref=0; _weak=weak;\
\n	if(t) set_ref(t->add_ref());\
\n    }\
\n    phylum_ptr(c"), kc_current_view );
		  kc_printer(kc_t("onst phylum_ptr<impl_abstract_phylum>& p, bool weak=false) {\
\n	_ref=0; _weak=weak;\
\n	set_ref(p.get_ref());\
\n    }\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("   phylum_ptr() { _ref=0; }\
\n    phylum_ptr(impl_abstract_phylum* t) {\
\n	_ref=0;\
\n	if(t) set_ref(t->add_ref());\
\n    }\
\n    phylum_ptr(const phylum_ptr<impl_abstract_phylum>& p) {\
\n	_ref=0;"), kc_current_view );
		  kc_printer(kc_t("\
\n	set_ref(p.get_ref());\
\n    }\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("\
\n    ~phylum_ptr() { set_ref(0); }\
\n\
\n    template <typename T>\
\n    phylum_ptr<impl_abstract_phylum>& operator=(T* t) {\
\n	if(t)\
\n	    set_ref(t->add_ref());\
\n	else\
\n	    set_ref(0);\
\n"), kc_current_view );
		  kc_printer(kc_t("	return *this;\
\n    }\
\n\
\n    template <typename T>\
\n    phylum_ptr<impl_abstract_phylum>& operator=(const phylum_ptr<T>& p) {\
\n	set_ref(p.get_ref());\
\n	return *this;\
\n    }\
\n\
\n    imp"), kc_current_view );
		  kc_printer(kc_t("l_abstract_phylum* get_phylum() const {\
\n	return _ref?_ref->get_abstract_phylum():0;\
\n    }\
\n\
\n    operator impl_abstract_phylum*() const { return get_phylum(); }\
\n    impl_abstract_phylum* o"), kc_current_view );
		  kc_printer(kc_t("perator()() const { return get_phylum(); }\
\n    impl_abstract_phylum* operator->() const { return get_phylum(); }\
\n    operator bool() const { return get_phylum()!=0; }\
\n    bool operator!() cons"), kc_current_view );
		  kc_printer(kc_t("t { return get_phylum()==0; }\
\n\
\n    abstract_phylum return_ptr() { if(_ref) _ref->lock(); return get_phylum(); }\
\n\
\n    bool operator==(int null) const { return null?false:(get_phylum()==0); }"), kc_current_view );
		  kc_printer(kc_t("\
\n    template <typename T>\
\n    bool operator==(const T* t) const { return get_phylum()==t; }\
\n    template <typename T>\
\n    bool operator==(const phylum_ptr<T>& t) const { return get_phylum("), kc_current_view );
		  kc_printer(kc_t(")==t.get_phylum(); }\
\n\
\n    bool operator!=(int null) const { return null?true:(get_phylum()!=0); }\
\n    template <typename T>\
\n    bool operator!=(const T* t) const { return get_phylum()!=t; }"), kc_current_view );
		  kc_printer(kc_t("\
\n    template <typename T>\
\n    bool operator!=(const phylum_ptr<T>& t) const { return get_phylum()!=t.get_phylum(); }\
\n\
\n    abstract_phylum_ref* get_ref() const { return _ref; }\
\n\
\n\rpro"), kc_current_view );
		  kc_printer(kc_t("tected:\v\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   void set_ref(abstract_phylum_ref* r) {\
\n	if(_ref!=r) {\
\n	    if(_weak) {\
\n		if(r) r->weak_ref();\
\n		if(_ref) _ref->weak_unref();\
\n	    }\
\n	    else {\
\n		if(r) r->ref();\
\n		if(_ref) _"), kc_current_view );
		  kc_printer(kc_t("ref->unref();\
\n	    }\
\n	    _ref=r;\
\n	}\
\n    }\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("   void set_ref(abstract_phylum_ref* r) {\
\n	if(_ref!=r) {\
\n	    if(r) r->ref();\
\n	    if(_ref) _ref->unref();\
\n	    _ref=r;\
\n	}\
\n    }\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("\
\n\rprivate:\v\
\n    abstract_phylum_ref* _ref;\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   bool _weak;\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("};\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\
\nclass "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("impl_abstract_list: "), kc_current_view); }

		{
		    baseclass_list kc_selvar_0_1 = phylum_cast<baseclass_list>(The_abstract_list_decl->base_classes);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consbaseclass_list)) {

			UNPARSE(The_abstract_list_decl->base_classes);

		    } else
		    {
			PRINT("public impl_abstract_phylum"); 
		    }
		}

		{ kc_printer(kc_t("{\
\n\rprivate:\v\
\n    void fprint_list(FILE *);\
\n    friend class impl_abstract_phylum;\
\n\rprotected:\v\
\n    abstract_phylum do_concat(c_abstract_phylum other, enum_operators) const;\
\n    ab"), kc_current_view );
		  kc_printer(kc_t("stract_phylum do_reverse(c_abstract_phylum tail, enum_operators) const;\
\n    abstract_phylum do_map(abstract_phylum (*kc_fp)(abstract_phylum), enum_operators);\
\n    abstract_phylum do_filter(bool ("), kc_current_view );
		  kc_printer(kc_t("*kc_fp)(abstract_phylum), enum_operators);\
\n    abstract_list   do_append(abstract_phylum, abstract_list);\
\n    abstract_phylum do_merge(abstract_list,abstract_phylum (*kc_fp)(abstract_phylum,abstr"), kc_current_view );
		  kc_printer(kc_t("act_phylum), enum_operators);\
\n    abstract_phylum do_reduce(abstract_phylum neutral, abstract_phylum (*kc_fp)(abstract_phylum,abstract_phylum));\
\n\rpublic:\v\n"), kc_current_view); }
		tapam = The_abstract_list_decl->additional_members; 
		kc::unparse(tapam, kc_printer, view_count_nonstaticmembers);
		if (!f_constructors_in_phylumdecl(The_abstract_list_decl) && gl_no_of_args!=0) 
		{
		    { kc_printer(kc_t("explicit impl_abstract_list()\v\n: "), kc_current_view); }
		    kc::unparse(gl_members, kc_printer, view_gen_user_assignment_inis);
		    { kc_printer(kc_t(" { }\r\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    virtual bool is_nil() const =0;\
\n    virtual abstract_list reverse() const =0;\
\n    int length() const;\
\n    abstract_phylum last() const;\
\n    // Non-virtual, non-existing... Type must be "), kc_current_view );
		  kc_printer(kc_t("known exactly anyway because\
\n    // of the function given as a parameter\
\n    //virtual abstract_list map( abstract_phylum (*)( abstract_phylum )) =0;\
\n    //virtual abstract_list filter(bool (*"), kc_current_view );
		  kc_printer(kc_t(")(abstract_phylum)) =0;\
\n    void freelist();\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("   impl_abstract_list* return_ptr() { if(get_ref()) get_ref()->lock(); return this; }\n"), kc_current_view); }
		}
		The_abstract_list_decl->additional_members->unparse(
		    kc_printer,view_gen_member_dcl_h); 
			{ kc_printer(kc_t("};\
\n"), kc_current_view); }
		kc::unparse(pds, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n//} // namespace Phylum\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_classdecls1_h_enum: {
	    view_gen_classdecls1_h_class& kc_current_view=static_cast<view_gen_classdecls1_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\nclass impl_abstract_phylum;\
\ntypedef impl_abstract_phylum * abstract_phylum;\
\ntypedef const impl_abstract_phylum * c_abstract_phylum;\
\nclass impl_abstract_list;\
\ntypedef impl_abstract_list "), kc_current_view );
		  kc_printer(kc_t("* abstract_list;\
\ntypedef const impl_abstract_list * c_abstract_list;\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("\
\n// Reference to a phylum (abstract base class)\
\nclass abstract_phylum_ref {\
\n\rprotected:\v\
\n    abstract_phylum_ref() {\
\n	_locked=false;\
\n	_ref_count=0;\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("	_weak_ref_count=0;\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("   }\
\n\
\n\rpublic:\v\
\n    void lock() {\
\n	_locked=true;\
\n    }\
\n    void unlock() {\
\n	if(_locked) {\
\n	    _locked=false;\
\n	    if(_ref_count==0 "), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("&& _weak_ref_count==0"), kc_current_view); }
		    }
		    { kc_printer(kc_t(") {\
\n		reset_ref();\
\n		reset_phylum();\
\n		delete this;\
\n	    }\
\n	}\
\n    }\
\n    int get_ref_count() const {\
\n	return _ref_count;\
\n    }\
\n    void ref() {\
\n	_locked=false;\
\n	++_re"), kc_current_view );
		  kc_printer(kc_t("f_count;\
\n    }\
\n    void unref() {\
\n	if(_ref_count)\
\n	    --_ref_count;\
\n	if(_ref_count==0 && !_locked) {\
\n	    clear();\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("	     if(_weak_ref_count==0)\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("		delete this;\
\n	}\
\n    }\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   int get_weak_ref_count() const {\
\n	return _weak_ref_count;\
\n    }\
\n    void weak_ref()  {\
\n	_locked=false;\
\n	++_weak_ref_count;\
\n    }\
\n    void weak_unref() {\
\n	if(_weak_ref_count)\
\n"), kc_current_view );
		  kc_printer(kc_t("	    --_weak_ref_count;\
\n	if(_weak_ref_count==0 && _ref_count==0 && !_locked) {\
\n	    reset_ref();\
\n	    delete this;\
\n	}\
\n    }\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("\
\n    virtual impl_abstract_phylum* get_abstract_phylum() const=0;\
\n    virtual void reset_phylum()=0;\
\n"), kc_current_view); }
		    The_abstract_phylum_ref_decl->additional_members->unparse(
			kc_printer,view_gen_member_dcl_h); 
		    	{ kc_printer(kc_t("\rprotected:\v\
\n    virtual void clear()=0;\
\n    virtual void reset_ref()=0;\
\n\rprivate:\v\
\n    int _ref_count;\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   int _weak_ref_count;\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("   bool _locked;\
\n};\n"), kc_current_view); }
		    { kc_printer(kc_t("// Template reference for each phylum\
\ntemplate <typename T>\
\nclass phylum_ref: public abstract_phylum_ref {\
\n\rpublic:\v\
\n    phylum_ref(T* t) { _phylum=t; }\
\n\
\n    T* get_phylum() const {"), kc_current_view );
		  kc_printer(kc_t(" return _phylum; }\
\n    impl_abstract_phylum* get_abstract_phylum() const { return _phylum; }\
\n\
\n    phylum_ref<T>& operator=(const T& t) {\
\n	abstract_phylum_ref* ref=t.get_ref();\
\n	if(ref)\
\n"), kc_current_view );
		  kc_printer(kc_t("	    set_phylum(static_cast<T*>(t.copy(true)));\
\n	else\
\n	    set_phylum(const_cast<T*>(&t));\
\n	return *this;\
\n    }\
\n    phylum_ref<T>& operator=(const phylum_ref<T>& r) {\
\n	T* t=r.get_phyl"), kc_current_view );
		  kc_printer(kc_t("um();\
\n	if(t) return operator=(*t);\
\n	set_phylum(0);\
\n	return *this;\
\n    }\
\n\
\n    void reset_phylum() { _phylum=0; }\
\n    void set_phylum(T* t) {\
\n	if(_phylum!=t) {\
\n	    _phylum->se"), kc_current_view );
		  kc_printer(kc_t("t_ref(0);\
\n	    _phylum->free();\
\n	    _phylum=t;\
\n	    if(_phylum)\
\n		_phylum->set_ref(this);\
\n	}\
\n    }\
\n\rprotected:\v\
\n    void clear() { if(_phylum) { reset_ref(); _phylum->free();"), kc_current_view );
		  kc_printer(kc_t(" _phylum=0; } }\
\n    void reset_ref() { if(_phylum) _phylum->set_ref(0); }\
\n\rprivate:\v\
\n    T* _phylum;\
\n};\n"), kc_current_view); }
		    { kc_printer(kc_t("// Smart pointer containing a reference\
\ntemplate <typename T>\
\nclass phylum_ptr {\
\n\rpublic:\v\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   phylum_ptr(bool weak=false) { _ref=0; _weak=weak; }\
\n    phylum_ptr(T* t,bool weak=false) {\
\n	_ref=0; _weak=weak;\
\n	if(t) set_ref(static_cast<phylum_ref<T>*>(t->add_ref()));\
\n    }\
\n    ph"), kc_current_view );
		  kc_printer(kc_t("ylum_ptr(const phylum_ptr<T>& p, bool weak=false) {\
\n	_ref=0; _weak=weak;\
\n	set_ref(p.get_ref());\
\n    }\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("   phylum_ptr() { _ref=0; }\
\n    phylum_ptr(T* t) {\
\n	_ref=0;\
\n	if(t) set_ref(static_cast<phylum_ref<T>*>(t->add_ref()));\
\n    }\
\n    phylum_ptr(const phylum_ptr<T>& p) {\
\n	_ref=0;\
\n	set_"), kc_current_view );
		  kc_printer(kc_t("ref(p.get_ref());\
\n    }\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("   ~phylum_ptr() { set_ref(0); }\
\n\
\n    phylum_ptr<T>& operator=(T* t) {\
\n	if(t)\
\n	    set_ref(static_cast<phylum_ref<T>*>(t->add_ref()));\
\n	else\
\n	    set_ref(0);\
\n	return *this;\
\n    "), kc_current_view );
		  kc_printer(kc_t("}\
\n\
\n    phylum_ptr<T>& operator=(const phylum_ptr<T>& p) {\
\n	set_ref(p.get_ref());\
\n	return *this;\
\n    }\
\n\
\n    T* get_phylum() const { return _ref?_ref->get_phylum():0; }\
\n\
\n    op"), kc_current_view );
		  kc_printer(kc_t("erator T*() const { return get_phylum(); }\
\n    T* operator()() const { return get_phylum(); }\
\n    T* operator->() const { return get_phylum(); }\
\n    operator bool() const { return get_phylum()"), kc_current_view );
		  kc_printer(kc_t("!=0; }\
\n    bool operator!() const { return get_phylum()==0; }\
\n\
\n    T* return_ptr() const { if(_ref) _ref->lock(); return get_phylum(); }\
\n\
\n    bool operator==(int null) const { return nul"), kc_current_view );
		  kc_printer(kc_t("l?false:(get_phylum()==0); }\
\n    bool operator==(const T* t) const { return get_phylum()==t; }\
\n    bool operator==(const phylum_ptr<T>& t) const { return get_phylum()==t.get_phylum(); }\
\n    bo"), kc_current_view );
		  kc_printer(kc_t("ol operator!=(int null) const { return null?true:(get_phylum()!=0); }\
\n    bool operator!=(const T* t) const { return get_phylum()!=t; }\
\n    bool operator!=(const phylum_ptr<T>& t) const { return "), kc_current_view );
		  kc_printer(kc_t("get_phylum()!=t.get_phylum(); }\
\n\
\n    phylum_ref<T>& operator*(){ return *add_ref(); }\
\n    const phylum_ref<T>& operator*() const {\
\n	return *const_cast<phylum_ptr<T>*>(this)->add_ref();\
\n "), kc_current_view );
		  kc_printer(kc_t("   }\
\n\
\n    phylum_ref<T>* get_ref() const { return _ref; }\
\n\
\n    phylum_ref<T>* add_ref() {\
\n	if(!_ref) set_ref(new phylum_ref<T>(0));\
\n	return _ref;\
\n    }\
\n\rprotected:\v\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   void set_ref(phylum_ref<T>* r) {\
\n	if(_ref!=r) {\
\n	    if(_weak) {\
\n		if(r) r->weak_ref();\
\n		if(_ref) _ref->weak_unref();\
\n	    }\
\n	    else {\
\n		if(r) r->ref();\
\n		if(_ref) _ref->u"), kc_current_view );
		  kc_printer(kc_t("nref();\
\n	    }\
\n	    _ref=r;\
\n	}\
\n    }\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("   void set_ref(phylum_ref<T>* r) {\
\n	if(_ref!=r) {\
\n	    if(r) r->ref();\
\n	    if(_ref) _ref->unref();\
\n	    _ref=r;\
\n	}\
\n    }\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("\
\n\rprivate:\v\
\n    phylum_ref<T>* _ref;\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("   bool _weak;\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("};\
\ntypedef phylum_ptr<impl_abstract_phylum> abstract_phylum_ptr;\
\n"), kc_current_view); }
		    if(g_options.weak_pointer) 
		    {
			{ kc_printer(kc_t("\
\ntemplate <typename T>\
\nclass weak_phylum_ptr: public phylum_ptr<T> {\
\n\rpublic:\v\
\n    weak_phylum_ptr(): phylum_ptr<T>(true){}\
\n    weak_phylum_ptr(T* t):phylum_ptr<T>(t,true){}\
\n    wea"), kc_current_view );
		  kc_printer(kc_t("k_phylum_ptr(const weak_phylum_ptr<T>& p):phylum_ptr<T>(p,true){}\
\n    weak_phylum_ptr(const phylum_ptr<T>& p):phylum_ptr<T>(p,true){}\
\n\
\n    weak_phylum_ptr<T>& operator=(T* t) {\
\n	if(t)\
\n	 "), kc_current_view );
		  kc_printer(kc_t("   set_ref(static_cast<phylum_ref<T>*>(t->add_ref()));\
\n	else\
\n	    set_ref(0);\
\n	return *this;\
\n    }\
\n\
\n    weak_phylum_ptr<T>& operator=(const phylum_ptr<T>& p) {\
\n	set_ref(p.get_ref()"), kc_current_view );
		  kc_printer(kc_t(");\
\n	return *this;\
\n    }\
\n};\
\ntypedef weak_phylum_ptr<impl_abstract_phylum> weak_abstract_phylum_ptr;\
\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("\
\ntemplate <typename P, typename T>\
\nP phylum_cast(phylum_ptr<T>& t) {\
\n    return static_cast<P>(t());\
\n}\
\ntemplate <typename P, typename T>\
\nconst P phylum_cast(const phylum_ptr<T>& t) {\
\n"), kc_current_view );
		  kc_printer(kc_t("    return static_cast<const P>(t());\
\n}\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\
\ntemplate <typename P, typename T>\
\nP phylum_cast(T* t) {\
\n    return static_cast<P>(t);\
\n}\
\ntemplate <typename P, typename T>\
\nconst P phylum_cast(const T* t) {\
\n    return static_cast<"), kc_current_view );
		  kc_printer(kc_t("const P>(t);\
\n}\
\n"), kc_current_view); }
		kc::unparse(pds, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n\
\nvoid kc_invalid_operator( const char *kc_func_prefix, enum_phyla kc_phy, int kc_line,\
\n	const char *kc_file, enum_operators kc_oper ) __attribute__ ((noreturn));\
\n\
\ntypedef enum_phyla *en"), kc_current_view );
		  kc_printer(kc_t("um_phyla_list;\
\n\
\n/*\
\n * make sure that the first 'real' storage class _always_ gets a value > 0\
\n * and kc_not_uniq gets a value == 0\
\n * (because then we can use it as a C boolean)\
\n */\
\n"), kc_current_view );
		  kc_printer(kc_t("enum kc_storageclass_t {\
\n	"), kc_current_view); }
		kc::unparse(Thestorageclasses, kc_printer, view_gen_operatormap_type_h);
		{ kc_printer(kc_t(",\
\nlast_storageclass\
\n};\
\n\
\ntypedef struct {\
\n    const char *name;			// name of the phylum\
\n    enum_operators first_operator;	// index in operator_info[]\
\n    enum_operators last_operat"), kc_current_view );
		  kc_printer(kc_t("or;	// index in operator_info[]\
\n    kc_storageclass_t uniq_stored;	// storage class\
\n} KC_PHYLUM_INFO;\
\n\
\ntypedef struct {\
\n    const char *name;			// name of the operator\
\n    size_t no_s"), kc_current_view );
		  kc_printer(kc_t("ons;			// number of sons\
\n    bool atomicity;			// atomic type or not\
\n    enum_phyla phylum;			// index in phylum_info[]\
\n    enum_phyla_list subphylum;		// indexes in phylum_info[]\
\n    int n"), kc_current_view );
		  kc_printer(kc_t("o_attrs;			// number of attributes\
\n    enum_phyla_list attribute;		// indexes in phylum_info[]\
\n    size_t size;			// size of operator (for statistics)\
\n} KC_OPERATOR_INFO;\
\n\
\ntypedef enum_p"), kc_current_view );
		  kc_printer(kc_t("hyla_list KC_UNIQ_INFO;\
\n\
\nextern KC_OPERATOR_INFO operator_info[];\
\nextern KC_PHYLUM_INFO phylum_info[];\
\nextern KC_UNIQ_INFO kc_UniqInfo[];\
\n\
\n#define KC_OP_NAME(op) (operator_info[op].na"), kc_current_view );
		  kc_printer(kc_t("me)\
\n#define KC_NO_SONS(prod) (operator_info[prod].no_sons)\
\n#define KC_ATOMICITY(prod) (operator_info[prod].atomicity)\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		kc::unparse(pds, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_default_types_unpk_c_enum: {
	    view_gen_default_types_unpk_c_class& kc_current_view=static_cast<view_gen_default_types_unpk_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\n#ifndef KC_TRACE_PROVIDED\
\n#define KC_TRACE_PROVIDED(COND,FILE,LINE,NODE) COND\
\n#endif\
\n\
\nvoid\
\nimpl_abstract_phylum::unparse(printer_function opf, uview uv)\
\n{\
\n    printer_functor_f"), kc_current_view );
		  kc_printer(kc_t("unction_wrapper pf(opf);\
\n    do_unparse(pf, uv);\
\n}\
\n\
\n// Everything given as a pointer is expected to have an unparse-method (we\
\n// believe it's a phylum), unless there's a specialisation "), kc_current_view );
		  kc_printer(kc_t("for it\
\n\
\nvoid\
\nunparse(abstract_phylum kc_p, printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    kc_p->unparse(kc_printer, kc_current_view);\
\n}\
\n\
\nvoid\
\nunparse(void *kc_p, pr"), kc_current_view );
		  kc_printer(kc_t("inter_functor kc_printer, uview kc_current_view)\
\n{\
\n    // MPi: 20020628 there shouldn't be any left\
\n    assertionFailed(\"Unparse called for untyped pointer\");\
\n    // MPi: cast should be u"), kc_current_view );
		  kc_printer(kc_t("nnecessary, but there are still void*\
\n    reinterpret_cast<impl_abstract_phylum*>(kc_p)->unparse(kc_printer, kc_current_view);\
\n}\
\n\
\nvoid\
\nunparse(int kc_v, printer_functor kc_printer, uview"), kc_current_view );
		  kc_printer(kc_t(" kc_current_view)\
\n{\
\n    kc_char_t kc_string[200];\
\n    kc_print_integer(kc_string, kc_v);\
\n    kc_printer(kc_string, kc_current_view);\
\n}\
\n\
\nvoid\
\nunparse(double kc_v, printer_functor"), kc_current_view );
		  kc_printer(kc_t(" kc_printer, uview kc_current_view)\
\n{\
\n    kc_char_t kc_string[200];\
\n    kc_print_real(kc_string, kc_v);\
\n    kc_printer(kc_string, kc_current_view);\
\n}\
\n\
\nvoid\
\nunparse(kc_char_t *kc"), kc_current_view );
		  kc_printer(kc_t("_v, printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    kc_printer(kc_v, kc_current_view);\
\n}\
\n\
\nvoid\
\nunparse(kc_string_t kc_v, printer_functor kc_printer, uview kc_current_view)\
\n"), kc_current_view );
		  kc_printer(kc_t("{\
\n    kc_printer(kc_v.c_str(), kc_current_view);\
\n}\
\n"), kc_current_view); }
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		assertReason(!g_options.no_unparse, "shouldn't create unpk.cc when not even generating unparse stuff");  
		 if (!g_options.no_unparse) 
		{
		    { kc_printer(kc_t("void\
\nimpl_abstract_phylum::default_unparse(printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    register int no_sons = operator_info[prod_sel()].no_sons;\
\n    for (int i=0; i < no_sons; "), kc_current_view );
		  kc_printer(kc_t("i++)\
\n	subphylum(i)->unparse(kc_printer, kc_current_view);\
\n}\
\n\
\nvoid\
\nimpl_casestring__Str::do_unparse(printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    kc::unparse(name, kc_pri"), kc_current_view );
		  kc_printer(kc_t("nter, kc_current_view);\
\n}\
\n\
\nvoid\
\nimpl_nocasestring_NoCaseStr::do_unparse(printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    kc::unparse(name, kc_printer, kc_current_view);\
\n}\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\nvoid\
\nimpl_integer__Int::do_unparse(printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    kc::unparse(value, kc_printer, kc_current_view);\
\n}\
\n\
\nvoid\
\nimpl_real__Real::do_unparse"), kc_current_view );
		  kc_printer(kc_t("(printer_functor kc_printer, uview kc_current_view)\
\n{\
\n    kc::unparse(value, kc_printer, kc_current_view);\
\n}\
\n\
\nvoid\
\nimpl_voidptr__VoidPtr::do_unparse(printer_functor kc_printer, uview "), kc_current_view );
		  kc_printer(kc_t("kc_current_view)\
\n{\
\n    kc::unparse(pointer, kc_printer, kc_current_view);\
\n}\
\n\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_unpk_c_enum: {
	    view_gen_unpk_c_class& kc_current_view=static_cast<view_gen_unpk_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#define KC_UNPARSE\
\n"), kc_current_view); }
		if(g_options.stdafx!="") {
		    PRINT("#include \"");
		    PRINT(g_options.stdafx.c_str());
		    PRINT("\"\n");
		}	
			{ kc_printer(kc_t("\
\n#include <stdio.h>\
\n#include <string>\
\n#include <stdlib.h>\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("unpk.h\"\
\n\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_open_namespace);
		kc::unparse(Theuviewnames, kc_printer, view_gen_viewvars_c);
		{ kc_printer(kc_t("\
\nimpl_uviews uviews[] = {\
\n"), kc_current_view); }
		kc::unparse(Theuviewnames, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	{0,0}\
\n};\
\n"), kc_current_view); }
		if(pg_languageshavebeendefined) 
		{
		    { kc_printer(kc_t("\n"), kc_current_view); }
		    { kc_printer(kc_t("#ifndef LANG_TEXT\n"), kc_current_view); }
		    { kc_printer(kc_t("#define LANG_TEXT(i) kc_language[i]\n"), kc_current_view); }
		    { kc_printer(kc_t("#endif\n\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_end_unpk_h_enum: {
	    view_gen_end_unpk_h_class& kc_current_view=static_cast<view_gen_end_unpk_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("#endif // KC_UNPARSE_HEADER\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedecls_h_enum: {
	    view_gen_rewritedecls_h_class& kc_current_view=static_cast<view_gen_rewritedecls_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\n/* Use rviews instead\
\nextern char *kc_rview_names[];\
\n*/\
\n"), kc_current_view); }
		kc::unparse(Therviewnames, kc_printer, view_rview_class_def);
	    }
	    break;
	}
	case view_gen_unparsedecls_h_enum: {
	    view_gen_unparsedecls_h_class& kc_current_view=static_cast<view_gen_unparsedecls_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		if(pg_languageshavebeendefined) 
		{
		    { kc_printer(kc_t("\n"), kc_current_view); }
		    { kc_printer(kc_t("#ifndef is_language\n"), kc_current_view); }
		    { kc_printer(kc_t("#define is_language(L) kc_language==kc_language_##L\n"), kc_current_view); }
		    { kc_printer(kc_t("#endif\n\n"), kc_current_view); }
		    { kc_printer(kc_t("#ifndef set_language\n"), kc_current_view); }
		    { kc_printer(kc_t("#define set_language(L) kc_language=kc_language_##L\n"), kc_current_view); }
		    { kc_printer(kc_t("#endif\n\n"), kc_current_view); }
		    { kc_printer(kc_t("extern char** kc_language;\n"), kc_current_view); }
		    kc::unparse(Thelanguages, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("\
\n/* Use uviews instead\
\nextern char *kc_view_names[];\
\n*/\
\n"), kc_current_view); }
		kc::unparse(Theuviewnames, kc_printer, view_uview_class_def);
		{ kc_printer(kc_t("\
\nvoid unparse(abstract_phylum kc_p, printer_functor kc_printer, uview kc_current_view);\
\nvoid unparse(void *kc_p, printer_functor kc_printer, uview kc_current_view);\
\nvoid unparse(int kc_v, prin"), kc_current_view );
		  kc_printer(kc_t("ter_functor kc_printer, uview kc_current_view);\
\nvoid unparse(double kc_v, printer_functor kc_printer, uview kc_current_view);\
\nvoid unparse(kc_char_t *kc_v, printer_functor kc_printer, uview kc_cu"), kc_current_view );
		  kc_printer(kc_t("rrent_view);\
\nvoid unparse(kc_string_t kc_v, printer_functor kc_printer, uview kc_current_view);\
\n#define PRINT(string) kc_printer(string,kc_current_view)\
\n#define UNPARSE(node) node->unparse(kc_"), kc_current_view );
		  kc_printer(kc_t("printer,kc_current_view)\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unpk_h_enum: {
	    view_gen_unpk_h_class& kc_current_view=static_cast<view_gen_unpk_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#ifndef KC_UNPARSE_HEADER\
\n#define KC_UNPARSE_HEADER\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fns_owninclude_c_enum: {
	    view_gen_fns_owninclude_c_class& kc_current_view=static_cast<view_gen_fns_owninclude_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("#include \""), kc_current_view); }
		PRINT(g_options.hfilename.c_str()); 
			{ kc_printer(kc_t("\"\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fns_start_c_enum: {
	    view_gen_fns_start_c_class& kc_current_view=static_cast<view_gen_fns_start_c_class&>(kc_current_view_base);
	    {
		char *printablefilename = f_make_identifier_basename( g_options.ccfilename.c_str() ); 
			{ kc_printer(kc_t("/* translation of file \""), kc_current_view); }
		kc::unparse(pg_filename, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#define KC_FUNCTIONS_"), kc_current_view); }
		kc::unparse(printablefilename, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		if(g_options.stdafx!="") {
		    PRINT("#include \"");
		    PRINT(g_options.stdafx.c_str());
		    PRINT("\"\n");
		}	
			{ kc_printer(kc_t("\
\n#include <stdlib.h>\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"\
\n"), kc_current_view); }
		delete[] printablefilename; 
	    }
	    break;
	}
	case view_gen_fns_end_h_enum: {
	    view_gen_fns_end_h_class& kc_current_view=static_cast<view_gen_fns_end_h_class&>(kc_current_view_base);
	    {
		char *printablefilename = f_make_identifier_basename( g_options.hfilename.c_str() ); 
			{ kc_printer(kc_t("\
\n#endif // !  KC_FUNCTIONS_"), kc_current_view); }
		kc::unparse(printablefilename, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_HEADER\
\n\
\n"), kc_current_view); }
		delete[] printablefilename; 
	    }
	    break;
	}
	case view_gen_fns_start_h_enum: {
	    view_gen_fns_start_h_class& kc_current_view=static_cast<view_gen_fns_start_h_class&>(kc_current_view_base);
	    {
		char *printablefilename = f_make_identifier_basename( g_options.hfilename.c_str() ); 
			{ kc_printer(kc_t("/* translation of file \""), kc_current_view); }
		kc::unparse(pg_filename, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#ifndef KC_FUNCTIONS_"), kc_current_view); }
		kc::unparse(printablefilename, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_HEADER\
\n#define KC_FUNCTIONS_"), kc_current_view); }
		kc::unparse(printablefilename, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_HEADER\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"    // in case a user forgets\
\n\
\n"), kc_current_view); }
		delete[] printablefilename; 
	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\n#ifndef KC_TRACE_PROVIDED\
\n#define KC_TRACE_PROVIDED(COND,FILE,LINE,NODE) COND\
\n#endif\
\n#ifndef KC_TRACE_REWRITE_MATCH\
\n#define KC_TRACE_REWRITE_MATCH(VIEW,FILE,LINE,NODE)\
\n#endif\
\n#ifn"), kc_current_view );
		  kc_printer(kc_t("def KC_TRACE_REWRITE_RESULT\
\n#define KC_TRACE_REWRITE_RESULT(VIEW,FILE,LINE,NODE)\
\n#endif\
\n	"), kc_current_view); }
		kc::unparse(pds, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_rewritek_c_enum: {
	    view_gen_rewritek_c_class& kc_current_view=static_cast<view_gen_rewritek_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#define KC_REWRITE\
\n"), kc_current_view); }
		if(g_options.stdafx!="") {
		    PRINT("#include \"");
		    PRINT(g_options.stdafx.c_str());
		    PRINT("\"\n");
		}   
			{ kc_printer(kc_t("\
\n#include <stdio.h>\
\n#include <sys/types.h>\
\n#include <stdlib.h>\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("rk.h\"\
\n\
\n"), kc_current_view); }
		if(g_options.rw_loop) 
		{
		    { kc_printer(kc_t("#include <deque>\
\n#include <stack>\
\n#include <vector>\
\n"), kc_current_view); }
		}
		kc::unparse(this, kc_printer, view_open_namespace);
		kc::unparse(Therviewnames, kc_printer, view_gen_viewvars_c);
		{ kc_printer(kc_t("\
\nimpl_rviews rviews[] = {\
\n"), kc_current_view); }
		kc::unparse(Therviewnames, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	{0,0}\
\n};\
\n"), kc_current_view); }
		if(g_options.rw_loop) 
		{
		    string how_smart = "";
		    if(g_options.smart_pointer) how_smart="_ptr"; 
		    	{ kc_printer(kc_t("\
\n\
\nstatic inline int\
\nkc_sons(abstract_phylum ph) {\
\n    return KC_NO_SONS(ph->prod_sel());\
\n}\
\n\
\nstatic abstract_phylum\
\nkc_create_op(enum_operators kc_op, std::vector<abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">& sons, size_t no_of_sons) {\
\n    size_t son_offset = sons.size()-no_of_sons;\
\n    switch(no_of_sons) {\n"), kc_current_view); }
		    kc::unparse(Theargsnumbers, kc_printer, kc_current_view);
		    { kc_printer(kc_t("   default:\v\
\n	assertionFailed(\"unexpected number of sub-phyla\");\r\
\n    }\r\
\n}\
\n\
\nstatic void\
\ninitialize_sons_stack(abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t("& kc_p, bool& skip,\
\n	std::stack<abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">& node_stack, std::stack<int>& sons_todo,\
\n	rview kc_current_view_base)\
\n{\
\n    // Initialize stack for depth first rewrite\
\n    assertCond(kc_p);\
\n    size_t no_of_sons=kc_sons(kc_p);\
\n "), kc_current_view );
		  kc_printer(kc_t("   while(!skip && (no_of_sons>0)) {\
\n	sons_todo.push(no_of_sons);\
\n	abstract_phylum parent = kc_p;\
\n	for(int i = no_of_sons-1; i>=0; --i) {\
\n	    node_stack.push(kc_p);\
\n	    kc_p = parent->s"), kc_current_view );
		  kc_printer(kc_t("ubphylum(i);\
\n	}\
\n	kc_p = kc_current_view_base.pre_rewrite(kc_p, skip);\
\n	assertCond(kc_p);\
\n	no_of_sons = kc_sons(kc_p);\
\n    }\
\n    // The deepest first son is now in kc_p.\
\n    // On t"), kc_current_view );
		  kc_printer(kc_t("he node_stack are the siblings and then the parent.\
\n}\
\n\
\nstatic bool\
\nsons_changed(abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" current_son, const std::vector<abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">& sons_done, size_t no_of_sons)\
\n{\
\n    bool changed = false;\
\n    for(int i=no_of_sons-1; i>=0; --i) {\
\n	if(sons_done[sons_done.size()-no_of_sons+i] != current_son->subphylum(i)) {\
\n	    ch"), kc_current_view );
		  kc_printer(kc_t("anged=true;\
\n	    break;\
\n	}\
\n    }\
\n    return changed;\
\n}\
\n\
\nabstract_phylum impl_abstract_phylum::rewrite_loop(rview kc_current_view_base) {\
\n    std::stack<abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t("> node_stack;\
\n    std::stack<int> sons_todo;\
\n    std::vector<abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t("> sons_done;\
\n\
\n    abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" current_son=this;\
\n\
\n    do {\
\n	bool skip=false;\
\n	current_son = kc_current_view_base.pre_rewrite(current_son, skip);\
\n	initialize_sons_stack(current_son, skip, node_stack, sons_todo, kc_cur"), kc_current_view );
		  kc_printer(kc_t("rent_view_base);\
\n	\
\n	bool changed=true;\
\n	do {\
\n	    assertCond(current_son);\
\n\
\n	    abstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" res=current_son;\
\n	    if(!skip)\
\n		res=current_son->do_rewrite(kc_current_view_base);\
\n\
\n	    assertCond(res);\
\n	    changed=true;\
\n\
\n	    if(res==current_son) { // nothing has been cha"), kc_current_view );
		  kc_printer(kc_t("nged, current_son is completely rewritten\
\n		if(!skip) { // call post_rewrite if this node is not skipped\
\n		    bool again=false;\
\n		    current_son=kc_current_view_base.post_rewrite(current_son"), kc_current_view );
		  kc_printer(kc_t(", again);\
\n		    assertCond(current_son);\
\n		    if(again)\
\n			\vbreak;\r // starts the whole rewrite_loop for the post_rewritten node again\
\n		}\
\n		else\
\n		    skip=false;\
\n\
\n		sons_do"), kc_current_view );
		  kc_printer(kc_t("ne.push_back(current_son); // move this son to sons_done\
\n\
\n		if(!node_stack.empty()) { // else all is done\
\n		    assertCond(!sons_todo.empty());\
\n		    assertCond(sons_todo.top()>0);\
\n		   "), kc_current_view );
		  kc_printer(kc_t(" --sons_todo.top(); // one less to todo\
\n\
\n		    if(sons_todo.top()==0) { // all sons done\
\n			sons_todo.pop(); // forget it\
\n\
\n			current_son=node_stack.top(); // the parent of the original "), kc_current_view );
		  kc_printer(kc_t("last done sons\
\n			node_stack.pop();\
\n			// the last (rewritten) son of this parent is\
\n			// on top of sons_done (sons_done[sons_done.size()-1])\
\n\
\n			size_t no_of_sons=kc_sons(current_son);"), kc_current_view );
		  kc_printer(kc_t("\
\n			assertCond(sons_done.size() >= no_of_sons);\
\n			changed = sons_changed(current_son, sons_done, no_of_sons);\
\n			if(changed) {	// some sons are different ->\
\n					\v\v// create a new operat"), kc_current_view );
		  kc_printer(kc_t("or and make it the current\
\n			    \r\rabstract_phylum"), kc_current_view); }
		    kc::unparse(how_smart, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" new_son =\
\n				\vkc_create_op(current_son->prod_sel(), sons_done, no_of_sons);\r\
\n			    new_son->rewrite_members(current_son);\
\n			    current_son = new_son;\
\n			    // the sons do not need t"), kc_current_view );
		  kc_printer(kc_t("o be rewritten again\
\n			    changed=false;\
\n			}\
\n			// The current node must still be rewritten,\
\n			// but not its sons anymore (changed == false).\
\n			// Those sons are in the current nod"), kc_current_view );
		  kc_printer(kc_t("e, so no-one needs\
\n			// them anymore and they are popped off the stack.\
\n			sons_done.resize(sons_done.size() - no_of_sons);\
\n		    }\
\n		    else { // make the complete loop with the next son"), kc_current_view );
		  kc_printer(kc_t(" (changed == true)\
\n			current_son = node_stack.top();\
\n			node_stack.pop();\
\n		    }\
\n		}\
\n		else {\
\n		    current_son = 0; // terminates the loop\
\n		}\
\n	    }\
\n	    else // somethin"), kc_current_view );
		  kc_printer(kc_t("g has been changed -> start rewrite with the changed node again\
\n		current_son=res;\
\n	} while(!changed);\
\n    } while(current_son);\
\n\
\n    assertCond(sons_todo.size()==0);\
\n    assertCond(s"), kc_current_view );
		  kc_printer(kc_t("ons_done.size()==1);\
\n    return sons_done[0]"), kc_current_view); }
		    if(g_options.smart_pointer) 
		    {
			{ kc_printer(kc_t(".return_ptr()"), kc_current_view); }
		    }
		    { kc_printer(kc_t("; // done.top()\
\n}\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_end_rewritek_h_enum: {
	    view_gen_end_rewritek_h_class& kc_current_view=static_cast<view_gen_end_rewritek_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("#endif // KC_REWRITE_HEADER\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritek_h_enum: {
	    view_gen_rewritek_h_class& kc_current_view=static_cast<view_gen_rewritek_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#ifndef KC_REWRITE_HEADER\
\n#define KC_REWRITE_HEADER\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_copydefs_c_enum: {
	    view_gen_copydefs_c_class& kc_current_view=static_cast<view_gen_copydefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("abstract_phylum\
\nimpl_abstract_phylum::copy(bool kc_copy_attributes) const\
\n{\
\n    enum_phyla kc_phy = phylum(); // XXX - implement special cases in subclasses - MvL\
\n    KC_OPERATOR_INFO *kc_o"), kc_current_view );
		  kc_printer(kc_t("p_info = &operator_info[prod_sel()];\
\n    kc_storageclass_t kc_st = phylum_info[kc_op_info->phylum].uniq_stored;\
\n    if (kc_st && kc_storageclass_still_uniq[kc_st])\
\n	return const_cast<abstract_"), kc_current_view );
		  kc_printer(kc_t("phylum>(this);\
\n    abstract_phylum kc_answer=0;\
\n    if (kc_phy == phylum_casestring) {\
\n	kc_answer=mkcasestring((dynamic_cast<c_casestring>(this))->name);\
\n    } else if (kc_phy == phylum_noc"), kc_current_view );
		  kc_printer(kc_t("asestring) {\
\n	kc_answer=mknocasestring((dynamic_cast<c_nocasestring>(this))->name);\
\n    } else if (kc_phy == phylum_voidptr) {\
\n	kc_answer=mkvoidptr((dynamic_cast<c_voidptr>(this))->pointer);\
\n"), kc_current_view );
		  kc_printer(kc_t("    } else if (kc_phy == phylum_integer) {\
\n	kc_answer=mkinteger((dynamic_cast<c_integer>(this))->value);\
\n    } else if (kc_phy == phylum_real) {\
\n	kc_answer=mkreal((dynamic_cast<c_real>(this))-"), kc_current_view );
		  kc_printer(kc_t(">value);\
\n    } else {\
\n	abstract_phylum kc_subtmp["), kc_current_view); }
		int i = Theargsnumbers->last()->value; if (i<=0) i = 1; 
		kc::unparse(i, kc_printer, kc_current_view);
		{ kc_printer(kc_t("], child;\
\n	for (int kc_i = 0; (child = subphylum(kc_i)); kc_i++) {\
\n	    kc_subtmp[kc_i] = child->copy(kc_copy_attributes);\
\n	}\
\n	switch(kc_op_info->no_sons) {\
\n"), kc_current_view); }
		kc::unparse(Theargsnumbers, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	default: assertionFailed(\"unexpected number of sub-phyla\");\
\n	}\
\n    }\
\n    if (kc_copy_attributes)\
\n	copy_attributes(kc_phy, this, kc_answer);\
\n    return kc_answer;\
\n}\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_copy_attributes_c_enum: {
	    view_gen_copy_attributes_c_class& kc_current_view=static_cast<view_gen_copy_attributes_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\nvoid\
\ncopy_attributes(enum_phyla copyPhy, c_abstract_phylum kc_p1, abstract_phylum kc_p2)\
\n{\
\n    switch(copyPhy) {\r\
\n"), kc_current_view); }
		kc::unparse(pds, kc_printer, kc_current_view);
		{ kc_printer(kc_t("   case one_before_first_phylum: // just to avoid a warning about missing case if empty\
\n    default:\
\n	\vbreak; // it's alright, no attributes to copy\r\
\n    }\
\n    enum_operators copyOp=kc_p1"), kc_current_view );
		  kc_printer(kc_t("->prod_sel();\
\n    for (int i=operator_info[copyOp].no_attrs-1; i>=0; --i)\v\
\n	attributeOf(kc_p2, i)=attributeOf(const_cast<abstract_phylum>(kc_p1), i);\r\
\n}\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_csgio_c_enum: {
	    view_gen_csgio_c_class& kc_current_view=static_cast<view_gen_csgio_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\n\
\nnamespace { // all local to this file\
\n\r\
\n/* macro that does the string concatenation */\
\n#define kc_str_conc2(a,b) strcat(strcpy(new char[strlen(a) + strlen(b) +1], a), b)\
\n\
\n/* fun"), kc_current_view );
		  kc_printer(kc_t("ction that reads the integers */\
\ninline void\
\nkc_do_get_int(int &c, int c_init, int &i, FILE *f)\
\n{\
\n    c = c_init;\
\n    i = 0;\
\n    while (isdigit(c)){\
\n	i = (i*10) + (c-'0');\
\n	c = "), kc_current_view );
		  kc_printer(kc_t("getc(f);\
\n    }\
\n}\
\n\
\nchar *kc_malloc_area = 0;\
\nsize_t kc_sizeof_malloc_area = 0;\
\nint kc_node_count;\
\nint kc_node_count_base;\
\n\
\nchar*\
\nkc_grow_malloc_area(size_t kc_s)\
\n{\
\n  "), kc_current_view );
		  kc_printer(kc_t("  delete kc_malloc_area;\
\n    kc_malloc_area = new char[kc_s];\
\n    kc_sizeof_malloc_area = kc_s;\
\n    return kc_malloc_area;\
\n}\
\n\
\ninline char*\
\nKC_GETMALLOCAREA(size_t kc_s)\
\n{\
\n   "), kc_current_view );
		  kc_printer(kc_t(" return kc_s > kc_sizeof_malloc_area ?\
\n	kc_grow_malloc_area(kc_s) : kc_malloc_area;\
\n}\
\n\
\n/* global variables */\
\nint kc_no_external_ops;\
\nconst int KC_NOT_FOUND_OPERATOR = -1;\
\nint kc_f"), kc_current_view );
		  kc_printer(kc_t("ile_offset_base;\
\nint kc_file_offset;\
\n\
\n/* Magic File descriptor(s) */\
\n/* Magic descriptors of length up to KC_MAGIC_LENGTH-1 are supported.  When changing\
\n * KC_MAGIC_LENGTH. change const"), kc_current_view );
		  kc_printer(kc_t("ant in MAGIC_READ_FORMAT to be one less than\
\n * KC_MAGIC_LENGTH. */\
\n/* Every file is assumed to start with the magic file descriptor for asc_csg_v3 */\
\n\
\nchar kc_ascii_prefix_magic_v3[] = \"A"), kc_current_view );
		  kc_printer(kc_t("#S#C#S#S#L#V#3\";\
\nchar kc_ascii_prefix_magic_hu[] = \"A#S#C#S#S#L#HUB\";\
\nconst int KC_MAGIC_LENGTH = 25;\
\nconst char *KC_MAGIC_READ_FORMAT = \"%24s\\n\";\
\n\
\n/* Operators with names of lengt"), kc_current_view );
		  kc_printer(kc_t("h upto OP_LENGTH-1 are supported. */\
\n/* When changing OP_LENGTH, change constant in OP_READ_FOMAT to be one less */\
\nconst int KC_OP_LENGTH = 256;\
\nconst char *KC_OP_READ_FORMAT = \"%255s\\n\";\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\n//**********************\
\n// Error-string Routine\
\nconst char*\
\nkc_CSGIOerrorstring(KC_IO_STATUS kc_io_status)\
\n{\
\n    switch( kc_io_status ) {\
\n	case KC_CSGIOSTATUS_NO_ERR: return( \"N"), kc_current_view );
		  kc_printer(kc_t("o errors\" );\
\n	case KC_CSGIOSTATUS_SCAN_ERR_1: return( \"Scan error(1)\" );\
\n	case KC_CSGIOSTATUS_SCAN_ERR_2: return( \"Scan error(2)\" );\
\n	case KC_CSGIOSTATUS_SCAN_ERR_3: return( \"Scan error("), kc_current_view );
		  kc_printer(kc_t("3)\" );\
\n	case KC_CSGIOSTATUS_SCAN_ERR_4: return( \"Scan error(4)\" );\
\n	case KC_CSGIOSTATUS_SCAN_ERR_5: return( \"Scan error(5)\" );\
\n	case KC_CSGIOSTATUS_GRAM_INCONSISTENT: return( \"Grammar is"), kc_current_view );
		  kc_printer(kc_t(" inconsistent\" );\
\n	case KC_CSGIOSTATUS_ROK: return( \"Read OK structure file\" );\
\n	case KC_CSGIOSTATUS_ILLEGAL_OPTION: return( \"Illegal option in write command\" );\
\n	case KC_CSGIOSTATUS_TOO_"), kc_current_view );
		  kc_printer(kc_t("MANY_OPERATORS: return( \"Too many operators for binary format\" );\
\n	case KC_CSGIOSTATUS_WOK: return( \"Written OK\" );\
\n	case KC_CSGIOSTATUS_TXT_FILE_INPUT: return( \"Read OK Text-file\" );\
\n	c"), kc_current_view );
		  kc_printer(kc_t("ase KC_CSGIOSTATUS_SYNTAX_ERROR: return( \"Syntax error\" );\
\n	case KC_CSGIOSTATUS_ILLEGAL_CONTEXT: return( \"Illegal context for operator\" );\
\n	case KC_CSGIOSTATUS_PREMATURE_EOF: return( \"Premat"), kc_current_view );
		  kc_printer(kc_t("ure eof in file\" );\
\n	case KC_CSGIOSTATUS_UNEXP_FATHER_MARK: return( \"Unexpected FATHER MARKER\" );\
\n	default: return( \"Unknown error code\" );\
\n    }\
\n}\
\n\
\nstruct csgio_info {\
\n  int "), kc_current_view );
		  kc_printer(kc_t("number;      // number of node, or -1 if no number\
\n  bool created;    // whether the node is already written\
\n  csgio_info():number(-1),created(false){}\
\n};\
\ntypedef std::map<const void*,csgio"), kc_current_view );
		  kc_printer(kc_t("_info> csgio_map;\
\ncsgio_map kc_CSGIOhashtable;\
\n\
\n/* Maps */\
\ntypedef struct {\
\n    int left;\
\n    int right;\
\n} kc_OpToOpMap_tuple_t;\
\n\
\nkc_OpToOpMap_tuple_t kc_OpToOpMap[KC_NO_OF_O"), kc_current_view );
		  kc_printer(kc_t("PERATORS];\
\nconst int KC_NOT_USED = -1;\
\n\
\nint\
\nkc_op_search(char *kc_s)\
\n{\
\n    int kc_i;\
\n    for ( kc_i=0; kc_i < KC_NO_OF_OPERATORS; kc_i++ ) {\
\n	if ( strcmp( kc_s, operator_info[kc"), kc_current_view );
		  kc_printer(kc_t("_i].name ) == 0 ) return( kc_i );\
\n    }\
\n    return( KC_NOT_FOUND_OPERATOR );\
\n}\
\n\
\nvoid\
\nkc_initializeOpToOpMap(int kc_v)\
\n{\
\n    int kc_i;\
\n    for ( kc_i=0; kc_i < KC_NO_OF_OPERAT"), kc_current_view );
		  kc_printer(kc_t("ORS; kc_i++ ) {\
\n	kc_OpToOpMap[kc_i].left = kc_i;\
\n	kc_OpToOpMap[kc_i].right = kc_v;\
\n}   }\
\n\
\nbool\
\nOpToOpMap_cmp_right(kc_OpToOpMap_tuple_t t1, kc_OpToOpMap_tuple_t t2)\
\n{\
\n    // sor"), kc_current_view );
		  kc_printer(kc_t("t in DECREASING order\
\n    return t1.right > t2.right;\
\n}\
\n\
\nbool\
\nOpToOpMap_cmp_left(kc_OpToOpMap_tuple_t t1, kc_OpToOpMap_tuple_t t2)\
\n{\
\n    // sort in INCREASING order\
\n    return t"), kc_current_view );
		  kc_printer(kc_t("1.left < t2.left;\
\n}\
\n\
\nvoid\
\nkc_renumberOpToOpMap()\
\n{\
\n    int kc_i, kc_j = 0;\
\n    for ( kc_i=0; kc_i < KC_NO_OF_OPERATORS; kc_i++ ) {\
\n	if (kc_OpToOpMap[kc_i].right > 0) {\
\n	    k"), kc_current_view );
		  kc_printer(kc_t("c_OpToOpMap[kc_i].right = kc_j++;\
\n	} else {\
\n	    kc_OpToOpMap[kc_i].right = KC_NOT_USED;\
\n}   }	}\
\n\
\n\
\n#define KC_MAKE_NEW_MAPPING(ext_op,int_op) kc_OpToOpMap[ext_op].right = int_op\
\n#d"), kc_current_view );
		  kc_printer(kc_t("efine KC_MAKE_NEW_SCAN_MAPPING(ext_op) kc_OpToOpMap[ext_op].right++\
\n#define KC_MAP(op) (kc_OpToOpMap[op].right)\
\n#define KC_IS_MAPPED(op) (kc_OpToOpMap[op].right != KC_NOT_USED)\
\n\
\nvoid\
\nkc_"), kc_current_view );
		  kc_printer(kc_t("error_operator_not_in_phylum(int kc_op, int kc_phy)\
\n{\
\n    const char *kc_error_message1 = \"operator not defined in phylum \";\
\n    const char *kc_error_message2 = \": \";\
\n    if ((kc_op <= "), kc_current_view );
		  kc_printer(kc_t("one_before_first_operator) || (kc_op >= last_operator)) {\
\n	char kc_value[30];\
\n	sprintf(kc_value, \"%d\",kc_op);\
\n	kc_csgio_err_reason = kc_str_conc2(\"unknown operator number: \", kc_value);\
\n"), kc_current_view );
		  kc_printer(kc_t("    } else {\
\n	kc_csgio_err_reason = (char*)strcat(strcat(strcat(strcpy(new char[(size_t)(strlen(kc_error_message1)+strlen(phylum_info[kc_phy].name)+strlen(kc_error_message2)+strlen(operator_info[kc_"), kc_current_view );
		  kc_printer(kc_t("op].name)+1)], kc_error_message1), phylum_info[kc_phy].name), kc_error_message2), operator_info[kc_op].name);\
\n    }\
\n    throw IO_exception(KC_CSGIOSTATUS_ILLEGAL_CONTEXT); /*NOTREACHED*/\
\n}\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\n} // anonymous namespace\
\n\
\nchar*\
\nIO_exception2char(IO_exception kc_p)\
\n{\
\n    char *kc_err_ret = 0;\
\n    const char *kc_err_sep = \": \";\
\n    if (kc_p.io_status != KC_CSGIOSTATUS_R"), kc_current_view );
		  kc_printer(kc_t("OK && kc_p.io_status != KC_CSGIOSTATUS_WOK) {\
\n	const char *kc_io_err = kc_CSGIOerrorstring(kc_p.io_status);\
\n	kc_err_ret = new char[strlen(kc_io_err)+strlen(kc_err_sep)+strlen(kc_p.err_reason)+1];"), kc_current_view );
		  kc_printer(kc_t("\
\n	strcpy(kc_err_ret, kc_io_err);\
\n	strcat(kc_err_ret, kc_err_sep);\
\n	strcat(kc_err_ret, kc_p.err_reason);\
\n    }\
\n    return kc_err_ret;\
\n}\
\n\
\nconst char *kc_csgio_err_reason = \"\";\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\n#ifndef KC_NO_CSGIO_READ\
\nnamespace { // all local to this file\
\n\r\
\n/* Base 64 numbers are written with the digits:\
\n   : ; < = > ? @ A-Z [ \\ ] ^ _ ` a-y\
\n   Base 10 numbers are written"), kc_current_view );
		  kc_printer(kc_t(" with the ordinary digits 0-9.\
\n   Other characters are used in special circumstances:\
\n    ! Indicates switch between reading attribute and unattributed nodes.\
\n    # Indicates that the father i"), kc_current_view );
		  kc_printer(kc_t("s the next PROD_INSTANCE in the file.\
\n    + Indicates that the following bytes are not a base 64 number\
\n    * Indicates a line containing a (decimal) count of attributes.\
\n*/\
\nconst char KC_B"), kc_current_view );
		  kc_printer(kc_t("64_ZERO_CHAR =	':';\
\nconst char KC_ASCII_ZERO =	'0';\
\nconst char KC_SWITCH_ATTR =	'!';\
\nconst char KC_FATHER_MARKER =	'#';\
\nconst char KC_NON_B64_CHAR =	'+';\
\nconst char KC_ATTR_COUNT =	'*';\
\n"), kc_current_view );
		  kc_printer(kc_t("const char KC_NULL_POINTER =    '.';\
\n\
\ninline bool\
\nKC_IS_B64(int c)\
\n{\
\n    return c>=KC_B64_ZERO_CHAR && c<KC_B64_ZERO_CHAR+64;\
\n}\
\n\
\n/* read and compute the base 64 integer in strea"), kc_current_view );
		  kc_printer(kc_t("m */\
\nunsigned\
\nget_rest_of_b64(FILE *kc_stream, register int kc_read_char, char kc_trailing_char)\
\n{\
\n    int kc_next_char;\
\n    int kc_offset;\
\n    int kc_i = 0;\
\n\
\n    if (!KC_IS_B64"), kc_current_view );
		  kc_printer(kc_t("(kc_read_char))\
\n	throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n    kc_offset = kc_read_char - KC_B64_ZERO_CHAR;\
\n\
\n    kc_next_char = getc(kc_stream);\
\n    while(KC_IS_B64(kc_next_char)) {"), kc_current_view );
		  kc_printer(kc_t("\
\n	kc_offset += (kc_next_char - KC_B64_ZERO_CHAR) << (6 * (++kc_i));\
\n	kc_next_char = getc(kc_stream);\
\n	}\
\n\
\n    if (kc_next_char == '-') {\
\n	kc_offset *= -1;\
\n	kc_next_char = getc(kc_st"), kc_current_view );
		  kc_printer(kc_t("ream);\
\n    }\
\n\
\n    if (kc_next_char != kc_trailing_char)\
\n	throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n    return kc_offset;\
\n}\
\n\
\n/* read shared functions */\
\ntypedef enum { KC"), kc_current_view );
		  kc_printer(kc_t("_NOT_READ_YET, KC_READ_EARLIER } KC_READ_STATUS;\
\n/* variable used by the sharing routines during a read */\
\n/* stores pointers to value_ptr fields */\
\nabstract_phylum *kc_offset_to_address_map;\
\n"), kc_current_view );
		  kc_printer(kc_t("char const* *kc_offset_to_address_map_base;\
\n\
\nvoid\
\nkc_init_read_sharing()\
\n{\
\n  kc_offset_to_address_map = new abstract_phylum[kc_node_count];\
\n  for(int i=0; i<kc_node_count; ++i) kc_off"), kc_current_view );
		  kc_printer(kc_t("set_to_address_map[i]=0;\
\n  kc_file_offset = 0;\
\n  kc_offset_to_address_map_base = new char const* [kc_node_count_base];\
\n  for(int j=0; j<kc_node_count_base; ++j) kc_offset_to_address_map_base[j"), kc_current_view );
		  kc_printer(kc_t("]=0;\
\n  kc_file_offset_base = 0;\
\n}\
\n\
\nKC_READ_STATUS\
\nkc_read_sharing_find(FILE *kc_stream, abstract_phylum &kc_valptr)\
\n{\
\n    char kc_first_char;\
\n    unsigned kc_offset;\
\n\
\n    "), kc_current_view );
		  kc_printer(kc_t("kc_first_char = getc(kc_stream);\
\n    if (KC_IS_B64(kc_first_char)) {\
\n	kc_offset = get_rest_of_b64(kc_stream, kc_first_char, '\\n');\
\n	int off=kc_file_offset - kc_offset;\
\n	assertReason(off>=0"), kc_current_view );
		  kc_printer(kc_t(" && off<=kc_node_count, \"base 64 offset out of range\");\
\n	kc_valptr = kc_offset_to_address_map[off];\
\n	return(KC_READ_EARLIER);\
\n    } else {\
\n	ungetc(kc_first_char, kc_stream);\
\n	return(KC"), kc_current_view );
		  kc_printer(kc_t("_NOT_READ_YET);\
\n    }\
\n}\
\n\
\nKC_READ_STATUS\
\nkc_read_sharing_find_base(FILE *kc_stream, char const* &kc_valptr)\
\n{\
\n    char kc_first_char;\
\n    unsigned kc_offset;\
\n\
\n    kc_first_"), kc_current_view );
		  kc_printer(kc_t("char = getc(kc_stream);\
\n    if (KC_IS_B64(kc_first_char)) {\
\n	kc_offset = get_rest_of_b64(kc_stream, kc_first_char, '\\n');\
\n	int off=kc_file_offset_base - kc_offset;\
\n	assertReason(off>=0 && "), kc_current_view );
		  kc_printer(kc_t("off<=kc_node_count_base, \"base 64 offset out of range\");\
\n	kc_valptr = kc_offset_to_address_map_base[off];\
\n	return(KC_READ_EARLIER);\
\n    } else {\
\n	return(KC_NOT_READ_YET);\
\n    }\
\n}\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\n#define kc_read_sharing_store(kc_ptr, kc_loc) \\\
\n    kc_offset_to_address_map[kc_loc] = kc_ptr\
\n#define kc_read_sharing_store_base(kc_ptr) \\\
\n    kc_offset_to_address_map_base[kc_file_offse"), kc_current_view );
		  kc_printer(kc_t("t_base++] = kc_ptr\
\n\
\n\
\nvoid\
\nkc_end_read_sharing()\
\n{\
\n  delete kc_offset_to_address_map;\
\n  delete kc_offset_to_address_map_base;\
\n}\
\n\
\nvoid\
\nkc_CSGIOdo_read_atom_denotation(FIL"), kc_current_view );
		  kc_printer(kc_t("E *kc_stream, char *kc_sbase, int kc_len)\
\n{\
\n    char * kc_sptr = kc_sbase;\
\n    register int kc_ch, kc_ch1;\
\n    register char kc_test;\
\n    register int kc_i;\
\n\
\n    for (kc_i=0; kc_i<"), kc_current_view );
		  kc_printer(kc_t("kc_len; kc_i++, kc_sptr++) {\
\n	kc_ch = getc(kc_stream);\
\n	if (kc_ch == '\\n') {\
\n	    ungetc(kc_ch, kc_stream);\
\n	    break;\
\n	}\
\n	*kc_sptr = (char) kc_ch;\
\n	if ( kc_ch == '\\\\' ) {\
\n	"), kc_current_view );
		  kc_printer(kc_t("    if ( ( kc_test = getc( kc_stream ) ) != '\\\\' ) { /* Must be escaped hex */\
\n		if (isdigit(kc_test)) kc_ch1 = kc_test - '0'; else kc_ch1 =kc_test + 10 - 'a';\
\n		kc_ch1 = 16 * kc_ch1;\
\n		kc_t"), kc_current_view );
		  kc_printer(kc_t("est = getc(kc_stream);\
\n		if (isdigit(kc_test)) kc_test= kc_test - '0'; else kc_test=kc_test + 10 - 'a';\
\n		kc_ch1 = kc_ch1 + kc_test;\
\n		*kc_sptr = (char)kc_ch1; /* cast is for explicit narrowin"), kc_current_view );
		  kc_printer(kc_t("g from int to char */\
\n	    }\
\n	}\
\n    }\
\n\
\n    kc_ch = getc(kc_stream);\
\n    if ( kc_ch == EOF ) throw IO_exception(KC_CSGIOSTATUS_PREMATURE_EOF);\
\n    else if (kc_ch != '\\n') throw IO_"), kc_current_view );
		  kc_printer(kc_t("exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n\
\n    *kc_sptr = '\\0';\
\n}\
\n\
\nabstract_phylum\
\nCSGIOread2dft(FILE *kc_stream, enum_phyla kc_phy)\
\n{\
\n    char *kc_sbase;\
\n    char const* c_kc_s"), kc_current_view );
		  kc_printer(kc_t("base;\
\n    int kc_len;\
\n    int kc_delim;\
\n    abstract_phylum kc_answer;\
\n    int kc_location;\
\n    bool kc_not_read_yet = false;\
\n\
\n/* get operator */\
\n    int kc_ext_op;\
\n    int k"), kc_current_view );
		  kc_printer(kc_t("c_testing;\
\n\
\n    /* XXX MPi: misleading comment? scan for optional unparsing version number */\
\n    if (kc_read_sharing_find( kc_stream, kc_answer ) == KC_READ_EARLIER ) {\
\n	// MPi: I believe "), kc_current_view );
		  kc_printer(kc_t("this is unnecessary or wrong - sharing is only done\
\n	// when phyla are the _same_, so they should remain the same.\
\n        // kc_answer = kc_answer->copy(false);\
\n	return kc_answer;\
\n    }\
\n"), kc_current_view );
		  kc_printer(kc_t("    kc_do_get_int(kc_testing,getc(kc_stream),kc_ext_op,kc_stream);\
\n    if ( kc_testing == EOF )\
\n	throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n    if ( kc_testing == KC_NULL_POINTER )\
\n    "), kc_current_view );
		  kc_printer(kc_t("{\
\n	kc_do_get_int(kc_testing,getc(kc_stream),kc_ext_op,kc_stream);\
\n	if ( kc_testing != '\\n' )\
\n	    throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n	return 0;\
\n    }\
\n    if ( kc_testing "), kc_current_view );
		  kc_printer(kc_t("== KC_FATHER_MARKER )\
\n	throw IO_exception(KC_CSGIOSTATUS_UNEXP_FATHER_MARK);\
\n    if ( kc_testing != '\\n' )\
\n	throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n    enum_operators kc_op(static_c"), kc_current_view );
		  kc_printer(kc_t("ast<enum_operators>(KC_MAP( kc_ext_op )));\
\n/* end get operator */\
\n\
\n    if (kc_op<phylum_info[kc_phy].first_operator || kc_op>phylum_info[kc_phy].last_operator)\
\n	    kc_error_operator_not_in"), kc_current_view );
		  kc_printer(kc_t("_phylum(kc_op,kc_phy);\
\n\
\n    kc_location = kc_file_offset++;\
\n    switch( kc_op ) {\r\
\n    case sel__VoidPtr:\v\
\n	// FATAL ERROR\
\n	kc_do_get_int(kc_delim,getc(kc_stream),kc_len,kc_stream);"), kc_current_view );
		  kc_printer(kc_t("\
\n	if ( kc_delim == EOF )\
\n	    throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n	kc_sbase = KC_GETMALLOCAREA(kc_len + 1); // +1 for '\\0'\
\n	kc_CSGIOdo_read_atom_denotation(kc_stream, kc_sbase, "), kc_current_view );
		  kc_printer(kc_t("kc_len);\
\n	kc_answer = 0;\
\n	break;\r\
\n    case sel__Int:\v\
\n	kc_do_get_int(kc_delim,getc(kc_stream),kc_len,kc_stream);\
\n	if ( kc_delim == EOF )\
\n	    throw IO_exception(KC_CSGIOSTATUS_SCAN_"), kc_current_view );
		  kc_printer(kc_t("ERR_1);\
\n	kc_sbase = KC_GETMALLOCAREA(kc_len + 1); // +1 for '\\0'\
\n	kc_CSGIOdo_read_atom_denotation(kc_stream, kc_sbase, kc_len);\
\n	kc_answer = mkinteger(::atoi(kc_sbase));\
\n	break;\r\
\n    c"), kc_current_view );
		  kc_printer(kc_t("ase sel__Real:\v\
\n	kc_do_get_int(kc_delim,getc(kc_stream),kc_len,kc_stream);\
\n	if ( kc_delim == EOF )\
\n	    throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n	kc_sbase = KC_GETMALLOCAREA(kc_len +"), kc_current_view );
		  kc_printer(kc_t(" 1); // +1 for '\\0'\
\n	kc_CSGIOdo_read_atom_denotation(kc_stream, kc_sbase, kc_len);\
\n	kc_answer = mkreal(::atof(kc_sbase));\
\n	break;\r\
\n    case sel__Str:\v\
\n	if (kc_read_sharing_find_base( "), kc_current_view );
		  kc_printer(kc_t("kc_stream, c_kc_sbase ) == KC_NOT_READ_YET) {\
\n	    kc_not_read_yet = true;\
\n	    kc_do_get_int(kc_delim,getc(kc_stream),kc_len,kc_stream);\
\n	    if ( kc_delim == EOF )\
\n		throw IO_exception(KC"), kc_current_view );
		  kc_printer(kc_t("_CSGIOSTATUS_SCAN_ERR_1);\
\n	    kc_sbase = KC_GETMALLOCAREA(kc_len + 1); /* +1 for '\\0' */\
\n	    kc_CSGIOdo_read_atom_denotation(kc_stream, kc_sbase, kc_len);\
\n	    c_kc_sbase=kc_sbase;\
\n	}\
\n"), kc_current_view );
		  kc_printer(kc_t("	kc_answer = mkcasestring( c_kc_sbase );\
\n	if (kc_not_read_yet) {\
\n	    kc_read_sharing_store_base( phylum_cast<casestring>(kc_answer)->name );\
\n	}\
\n	break;\r\
\n    case sel_NoCaseStr:\v\
\n	i"), kc_current_view );
		  kc_printer(kc_t("f (kc_read_sharing_find_base( kc_stream, c_kc_sbase ) == KC_NOT_READ_YET) {\
\n	    kc_not_read_yet = true;\
\n	    kc_do_get_int(kc_delim,getc(kc_stream),kc_len,kc_stream);\
\n	    if ( kc_delim == EO"), kc_current_view );
		  kc_printer(kc_t("F )\
\n		throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n	    kc_sbase = KC_GETMALLOCAREA(kc_len + 1); /* +1 for '\\0' */\
\n	    kc_CSGIOdo_read_atom_denotation(kc_stream, kc_sbase, kc_len);\
\n	   "), kc_current_view );
		  kc_printer(kc_t(" c_kc_sbase=kc_sbase;\
\n	}\
\n	kc_answer = mknocasestring( c_kc_sbase );\
\n	if (kc_not_read_yet) {\
\n	    kc_read_sharing_store_base( phylum_cast<nocasestring>(kc_answer)->name );\
\n	}\
\n	break;\
\n"), kc_current_view );
		  kc_printer(kc_t("    default:\v\
\n	abstract_phylum kc_subtmp["), kc_current_view); }
		int i = Theargsnumbers->last()->value; if (i<=0) i = 1; 
		kc::unparse(i, kc_printer, kc_current_view);
		{ kc_printer(kc_t("];\
\n	for (int kc_i = 0; kc_i < operator_info[kc_op].no_sons; ++kc_i) {\
\n	    kc_subtmp[kc_i] = CSGIOread2dft(kc_stream, operator_info[kc_op].subphylum[kc_i] );\
\n	    assertReason(kc_subtmp[kc_i]!"), kc_current_view );
		  kc_printer(kc_t("=0, \"shared phylum is not contained in file (reference is wrong)\");\
\n	}\
\n"), kc_current_view); }
		{ kc_printer(kc_t("	switch(operator_info[kc_op].no_sons) {\
\n"), kc_current_view); }
		kc::unparse(Theargsnumbers, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	default:\v\
\n	    assertionFailed(\"unexpected number of sub-phyla\"); break;\r\
\n	}\r\
\n	// Read attributes\
\n	for (int kc_i=0; kc_i<operator_info[kc_op].no_attrs; ++kc_i)\v\
\n	    attributeOf(k"), kc_current_view );
		  kc_printer(kc_t("c_answer, kc_i)=\v\
\n		CSGIOread2dft(kc_stream, operator_info[kc_op].attribute[kc_i]);\r\r\
\n    }\
\n \
\n    kc_read_sharing_store( kc_answer, kc_location );\
\n    return kc_answer;\
\n}\
\n\
\n} "), kc_current_view );
		  kc_printer(kc_t("// anonymous namespace\
\n\
\nvoid\
\nCSGIOreadphylum(FILE *kc_stream, abstract_phylum &kc_ptr, enum_phyla kc_phy)\
\n{\
\n    int kc_scan_return_code;\
\n    char kc_magic_no[KC_MAGIC_LENGTH];\
\n    "), kc_current_view );
		  kc_printer(kc_t("char kc_dollarcode[KC_OP_LENGTH];\
\n    char kc_ext_name[KC_OP_LENGTH];\
\n    int kc_operator;\
\n\
\n    kc_csgio_err_reason = \"\";\
\n    kc_scan_return_code = fscanf( kc_stream, KC_MAGIC_READ_FOR"), kc_current_view );
		  kc_printer(kc_t("MAT, kc_magic_no );\
\n    if ( kc_scan_return_code != 1 )\
\n	throw IO_exception(KC_CSGIOSTATUS_GRAM_INCONSISTENT, \"magic string not scanned\") ;\
\n    if ( strcmp( kc_magic_no, kc_ascii_prefix_magi"), kc_current_view );
		  kc_printer(kc_t("c_v3 ) != 0 &&\
\n	    strcmp( kc_magic_no, kc_ascii_prefix_magic_hu ) != 0 )\
\n	throw IO_exception(KC_CSGIOSTATUS_GRAM_INCONSISTENT,\"scanned magic string is not asc_ssl_v3 (or HUB specific) magic st"), kc_current_view );
		  kc_printer(kc_t("ring\") ;\
\n    if ( fscanf( kc_stream, \"$%[^ ] \\n\", kc_dollarcode ) != 1 )\
\n	throw IO_exception(KC_CSGIOSTATUS_GRAM_INCONSISTENT,\"problems finding $ before operators\") ;\
\n    while ( strcmp("), kc_current_view );
		  kc_printer(kc_t(" kc_dollarcode, \"operators\" ) != 0 ) {\
\n	if ( fscanf( kc_stream, \"%*[^$]$%[^ ] \\n\", kc_dollarcode) != 1 )\
\n	    throw IO_exception(KC_CSGIOSTATUS_GRAM_INCONSISTENT,\"problems finding operators"), kc_current_view );
		  kc_printer(kc_t(" keyword\") ;\
\n    }\
\n    /* read all external operator definitions and initialize map */\
\n    kc_no_external_ops = 0;\
\n    kc_initializeOpToOpMap(KC_NOT_FOUND_OPERATOR);\
\n    while (true) {\
\n"), kc_current_view );
		  kc_printer(kc_t("	int kc_ext_arity, kc_ext_attr_arity, kc_ext_atomicity;\
\n\
\n	if ( fscanf( kc_stream, \"%[^ ] \", kc_ext_name ) != 1 )\
\n	    throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_3, \"no operator name at star"), kc_current_view );
		  kc_printer(kc_t("t of line\") ;\
\n	else if ( kc_ext_name[0] == '$' )\
\n	    break;\
\n	else if ( fscanf( kc_stream, \"%d %d %d\\n\", &kc_ext_arity, &kc_ext_attr_arity, &kc_ext_atomicity ) != 3 )\
\n	    throw IO_exce"), kc_current_view );
		  kc_printer(kc_t("ption(KC_CSGIOSTATUS_SCAN_ERR_4, \"no arity, attr_arity or atomicity\") ;\
\n	else {\
\n	    kc_operator = kc_op_search( kc_ext_name );\
\n	    if ( ( kc_operator == KC_NOT_FOUND_OPERATOR ) ||\
\n		 ( "), kc_current_view );
		  kc_printer(kc_t("KC_NO_SONS( kc_operator ) != kc_ext_arity ) ||\
\n		 ( KC_ATOMICITY( kc_operator) != (kc_ext_atomicity!=0) )\
\n	       )\
\n		throw IO_exception(KC_CSGIOSTATUS_GRAM_INCONSISTENT, kc_str_conc2(\"proble"), kc_current_view );
		  kc_printer(kc_t("ms with operator: \",kc_ext_name)) ;\
\n	    else {\
\n		KC_MAKE_NEW_MAPPING( kc_no_external_ops, kc_operator );\
\n		kc_no_external_ops++;\
\n    }	}   }\
\n    /* ascertain that we are at the $object"), kc_current_view );
		  kc_printer(kc_t(" section, or get to that point */\
\n    if ( strcmp( kc_ext_name, \"$object\" ) != 0 ) /* if not at $object */\
\n	while ( strcmp( kc_ext_name, \"object\" ) != 0 ) {\
\n	    if ( fscanf( kc_stream, \""), kc_current_view );
		  kc_printer(kc_t("%*[^$]$%[^ ]\", kc_ext_name ) != 1 )\
\n		throw IO_exception(KC_CSGIOSTATUS_GRAM_INCONSISTENT, kc_str_conc2(\"problems finding start of object section\",\"\")) ;\
\n	}\
\n\
\n    /* read node_count; se"), kc_current_view );
		  kc_printer(kc_t("t up address map */\
\n    if (fscanf(kc_stream, \"%d %d\\n\", &kc_node_count, &kc_node_count_base) != 2)\
\n	throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_1);\
\n    kc_init_read_sharing(); /* for shared"), kc_current_view );
		  kc_printer(kc_t(" values */\
\n\
\n    /* read the tree (actually a graph) */\
\n    kc_ptr = CSGIOread2dft( kc_stream, kc_phy );\
\n    kc_end_read_sharing(); /* for atomic values */\
\n}\
\n#endif // ! KC_NO_CSGIO_RE"), kc_current_view );
		  kc_printer(kc_t("AD\
\n\
\n#ifndef KC_NO_CSGIO_WRITE\
\nnamespace { // all local to this file\
\n\r\
\n\
\n// print a string to a file, escaping backslashes and non-printables\
\nvoid\
\nkc_print_to_file(FILE *kc_f, ch"), kc_current_view );
		  kc_printer(kc_t("ar const* kc_value)\
\n{\
\n    unsigned char const* kc_vptr = (unsigned char const*)kc_value;\
\n    int kc_len = strlen(kc_value);\
\n    int kc_i;\
\n\
\n    fprintf(kc_f, \"%d \", kc_len);\
\n    f"), kc_current_view );
		  kc_printer(kc_t("or (kc_i=0; kc_i<kc_len; kc_i++, kc_vptr++) {\
\n	if (*kc_vptr == '\\\\') {\
\n	    fprintf(kc_f, \"\\\\\\\\\");\
\n	} else if (isprint(*kc_vptr)) {\
\n	    putc((char)*kc_vptr, kc_f);\
\n	} else {\
\n"), kc_current_view );
		  kc_printer(kc_t("	    fprintf(kc_f, \"\\\\%.2x\", *kc_vptr);\
\n	}\
\n    }\
\n    putc('\\n', kc_f);\
\n}\
\n\
\nvoid\
\nkc_print_b64_to_file(FILE *kc_f, int kc_value)\
\n{\
\n    unsigned int kc_pos_value;\
\n\
\n   "), kc_current_view );
		  kc_printer(kc_t(" if (kc_value == 0) {\
\n	putc(KC_B64_ZERO_CHAR, kc_f);\
\n    } else {\
\n	kc_pos_value = abs(kc_value);\
\n	while (kc_pos_value != 0) {\
\n	    putc((kc_pos_value & ((1 << 6) - 1) ) + KC_B64_ZERO_CHA"), kc_current_view );
		  kc_printer(kc_t("R, kc_f);\
\n	    kc_pos_value >>= 6;\
\n	}\
\n	if (kc_value < 0) {\
\n	    putc('-', kc_f);\
\n	}\
\n    }\
\n    putc('\\n', kc_f);\
\n}\
\n\
\n// realize sharing of strings in ouput file\
\nvoid\
\n"), kc_current_view );
		  kc_printer(kc_t("kc_CSGIOscan(c_abstract_phylum kc_p)\
\n{\
\n    if (kc_p==0) return;\
\n    enum_operators kc_op = kc_p->prod_sel();\
\n    if (kc_CSGIOhashtable[kc_p].number == -1) {\
\n	kc_CSGIOhashtable[kc_p].numb"), kc_current_view );
		  kc_printer(kc_t("er = kc_node_count++;\
\n	KC_MAKE_NEW_SCAN_MAPPING( kc_op );\
\n	switch(kc_op) {\
\n	case sel__Str:\
\n	case sel_NoCaseStr: {\
\n	    char const* s = static_cast<c_casestring>(kc_p)->name;\
\n	    if ("), kc_current_view );
		  kc_printer(kc_t("kc_CSGIOhashtable[s].number == -1)\v\
\n		kc_CSGIOhashtable[s].number = kc_node_count_base++;\r\
\n	    break;\
\n	}\
\n        default: {\
\n	    abstract_phylum child;\
\n            for (int i=0; (c"), kc_current_view );
		  kc_printer(kc_t("hild = kc_p->subphylum(i)); ++i)\v\
\n		kc_CSGIOscan(child);\r\
\n	}\
\n	}\
\n	for (int i=0; i<operator_info[kc_op].no_attrs; ++i)\v\
\n	    kc_CSGIOscan(attributeOf(const_cast<abstract_phylum>(kc_p), "), kc_current_view );
		  kc_printer(kc_t("i));\r\
\n    }\
\n}\
\n\
\nvoid\
\nkc_CSGIOwrite2structure(FILE *kc_stream, c_abstract_phylum kc_p)\
\n{\
\n    if (kc_p==0) {\
\n	fprintf( kc_stream, \"%c\\n\", KC_NULL_POINTER );\
\n	return;\
\n    "), kc_current_view );
		  kc_printer(kc_t("}\
\n    char _kc_value[30];\
\n    char *kc_value = _kc_value;\
\n    enum_operators kc_op = kc_p->prod_sel();\
\n    csgio_info &kc_hn = kc_CSGIOhashtable[kc_p];\
\n    if (kc_hn.created) {\
\n	kc_pr"), kc_current_view );
		  kc_printer(kc_t("int_b64_to_file( kc_stream, kc_file_offset - kc_hn.number );\
\n    } else {\
\n	kc_hn.created = true;\
\n	fprintf( kc_stream, \"%d\\n\", KC_MAP( kc_op ) );\
\n	kc_file_offset++;\
\n	switch(kc_op) {\r\
\n"), kc_current_view );
		  kc_printer(kc_t("	case sel__VoidPtr:\v\
\n	    /* FATAL ERROR */\
\n	    sprintf( kc_value, \"%p\", static_cast<c_voidptr>(kc_p)->pointer);\
\n	    kc_print_to_file( kc_stream, kc_value );\
\n	    kc_file_offset_base++"), kc_current_view );
		  kc_printer(kc_t(";\
\n	    break;\r\
\n	case sel__Str:\
\n	case sel_NoCaseStr:\v\
\n	    fprintf( kc_stream, \"%c\", KC_NON_B64_CHAR );\
\n	    kc_print_to_file( kc_stream, static_cast<c_casestring>(kc_p)->name);\
\n	 "), kc_current_view );
		  kc_printer(kc_t("   kc_file_offset_base++;\
\n	    break;\r\
\n	case sel__Int:\v\
\n	    sprintf( kc_value, \"%d\", static_cast<c_integer>(kc_p)->value);\
\n	    kc_print_to_file( kc_stream, kc_value );\
\n	    kc_file"), kc_current_view );
		  kc_printer(kc_t("_offset_base++;\
\n	    break;\r\
\n	case sel__Real:\v\
\n	    sprintf( kc_value, \"%.20f\", static_cast<c_real>(kc_p)->value);\
\n	    kc_print_to_file( kc_stream, kc_value );\
\n	    kc_file_offset_b"), kc_current_view );
		  kc_printer(kc_t("ase++;\
\n	    break;\r\
\n	default:\
\n            abstract_phylum child;\
\n            for (int kc_i=0; (child = kc_p->subphylum(kc_i)); ++kc_i)\v\
\n		kc_CSGIOwrite2structure(kc_stream, child);\r\
\n"), kc_current_view );
		  kc_printer(kc_t("	    // Write attributes\
\n	    for (int kc_i=0; kc_i<operator_info[kc_op].no_attrs; ++kc_i)\v\
\n		kc_CSGIOwrite2structure(kc_stream, attributeOf(const_cast<abstract_phylum>(kc_p), kc_i));\r\
\n	}\
\n"), kc_current_view );
		  kc_printer(kc_t("    }\
\n}\
\n\
\nvoid\
\nCSGIOwrite(FILE *kc_stream, c_abstract_phylum kc_p)\
\n{\
\n    int kc_i;\
\n    kc_csgio_err_reason = \"\";\
\n\
\n    /* write out the magic string and $operators string */\
\n"), kc_current_view );
		  kc_printer(kc_t("    fprintf( kc_stream, \"%s\\n$operators \\n\", kc_ascii_prefix_magic_hu );\
\n\
\n    /* Initialize map from internal operators to external operators, */\
\n    /* initially empty */\
\n    kc_no_ext"), kc_current_view );
		  kc_printer(kc_t("ernal_ops = 0;\
\n    kc_node_count = 0;\
\n    kc_node_count_base = 0;\
\n    kc_initializeOpToOpMap(0); /* initialize to 0, not any other value */\
\n\
\n    // realize sharing\
\n    kc_CSGIOscan(kc"), kc_current_view );
		  kc_printer(kc_t("_p);\
\n    /* sort the optoopmap on decreasing operator usage */\
\n    std::sort(&kc_OpToOpMap[0], &kc_OpToOpMap[KC_NO_OF_OPERATORS], OpToOpMap_cmp_right);\
\n    kc_renumberOpToOpMap();\
\n\
\n    /"), kc_current_view );
		  kc_printer(kc_t("* write out the _sorted_ operator table */\
\n    for(kc_i = 0; kc_i < KC_NO_OF_OPERATORS; kc_i++) {\
\n	if (kc_OpToOpMap[kc_i].right != KC_NOT_USED) {\
\n	    fprintf( kc_stream, \"%s %d %d %d\\n\", K"), kc_current_view );
		  kc_printer(kc_t("C_OP_NAME( kc_OpToOpMap[kc_i].left), KC_NO_SONS( kc_OpToOpMap[kc_i].left ), 0, KC_ATOMICITY( kc_OpToOpMap[kc_i].left ) );\
\n    }	}\
\n\
\n    /* sort the optoopmap increasing on the operator number *"), kc_current_view );
		  kc_printer(kc_t("/\
\n    std::sort(&kc_OpToOpMap[0], &kc_OpToOpMap[KC_NO_OF_OPERATORS], OpToOpMap_cmp_left);\
\n\
\n    /* write out the grammar terminator string and the number of nodes */\
\n    fprintf( kc_stream, "), kc_current_view );
		  kc_printer(kc_t("\"$object \\n%d %d\\n\", kc_node_count, kc_node_count_base );\
\n\
\n    /* write out the tree */\
\n    kc_file_offset = 0;\
\n    kc_file_offset_base = 0;\
\n    kc_CSGIOwrite2structure( kc_stream, k"), kc_current_view );
		  kc_printer(kc_t("c_p);\
\n    kc_CSGIOhashtable.clear();\
\n}\
\n\
\n} // anonymous namespace\
\n\
\nvoid\
\nimpl_abstract_phylum::CSGIOwrite(FILE *kc_stream) const\
\n{\
\n    kc::CSGIOwrite(kc_stream, this);\
\n}\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\n#endif // ! KC_NO_CSGIO_WRITE\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_csgio_start_c_enum: {
	    view_gen_csgio_start_c_class& kc_current_view=static_cast<view_gen_csgio_start_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#define KC_CSGIO\
\n"), kc_current_view); }
		if(g_options.stdafx!="") {
		    PRINT("#include \"");
		    PRINT(g_options.stdafx.c_str());
		    PRINT("\"\n");
		}	
			{ kc_printer(kc_t("\
\n#include <stdio.h>\
\n#include <setjmp.h>\
\n#include <ctype.h>\
\n#include <stdlib.h>\
\n#include <map>\
\n#include <algorithm>\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("csgiok.h\"\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_csgio_h_enum: {
	    view_gen_csgio_h_class& kc_current_view=static_cast<view_gen_csgio_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\nextern const char *kc_csgio_err_reason;\
\n\
\ntypedef enum {\
\n    KC_CSGIOSTATUS_NO_ERR = 0,\
\n    KC_CSGIOSTATUS_SCAN_ERR_1, KC_CSGIOSTATUS_SCAN_ERR_2, KC_CSGIOSTATUS_SCAN_ERR_3,\
\n    KC_CSG"), kc_current_view );
		  kc_printer(kc_t("IOSTATUS_SCAN_ERR_4, KC_CSGIOSTATUS_SCAN_ERR_5, KC_CSGIOSTATUS_GRAM_INCONSISTENT,\
\n    KC_CSGIOSTATUS_ROK, KC_CSGIOSTATUS_ILLEGAL_OPTION, KC_CSGIOSTATUS_TOO_MANY_OPERATORS,\
\n    KC_CSGIOSTATUS_WOK,"), kc_current_view );
		  kc_printer(kc_t(" KC_CSGIOSTATUS_TXT_FILE_INPUT, KC_CSGIOSTATUS_SYNTAX_ERROR,\
\n    KC_CSGIOSTATUS_ILLEGAL_CONTEXT, KC_CSGIOSTATUS_PREMATURE_EOF,\
\n    KC_CSGIOSTATUS_UNEXP_FATHER_MARK\
\n} KC_IO_STATUS;\
\n\
\n// XX"), kc_current_view );
		  kc_printer(kc_t("X Needs to be extended\
\nstruct IO_exception {\
\n    IO_exception(KC_IO_STATUS _io_status, const char* _err_reason=kc_csgio_err_reason, int _line=0)\
\n	: io_status(_io_status), err_reason(_err_reaso"), kc_current_view );
		  kc_printer(kc_t("n), line(_line) { }\
\n    KC_IO_STATUS io_status;\
\n    const char *err_reason;\
\n    int line;\
\n};\
\n\
\nchar* IO_exception2char(IO_exception);\
\n\
\n#if defined(__GNUC__) && __GNUC__<3\
\n    "), kc_current_view );
		  kc_printer(kc_t("extern void CSGIOreadphylum(FILE*, abstract_phylum&, enum_phyla);\
\n#endif\
\n\
\ntemplate<typename P> void\
\nCSGIOread(FILE* kc_stream, P &kc_p)\
\n{\
\n    abstract_phylum kc_value;\
\n#if !(define"), kc_current_view );
		  kc_printer(kc_t("d(__GNUC__) && __GNUC__<3)\
\n    extern void CSGIOreadphylum(FILE*, abstract_phylum&, enum_phyla);\
\n#endif\
\n    CSGIOreadphylum( kc_stream, kc_value, kc_p->phylum_sel_ );\
\n    // Cast _could_ be"), kc_current_view );
		  kc_printer(kc_t(" static, but just to be completely sure\
\n    if (dynamic_cast<P>(kc_value)==0)\
\n	throw IO_exception(KC_CSGIOSTATUS_SCAN_ERR_5, \"Internal problem: Wrong phylum type created.\");\
\n    kc_p = dynam"), kc_current_view );
		  kc_printer(kc_t("ic_cast<P>(kc_value);\
\n}\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_csgio_end_h_enum: {
	    view_gen_csgio_end_h_class& kc_current_view=static_cast<view_gen_csgio_end_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t(" #endif // KC_CSGIO_HEADER\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_csgio_start_h_enum: {
	    view_gen_csgio_start_h_class& kc_current_view=static_cast<view_gen_csgio_start_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#ifndef KC_CSGIO_HEADER\
\n#define KC_CSGIO_HEADER\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"    // in case a user forgets\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_listdefs_c_enum: {
	    view_gen_listdefs_c_class& kc_current_view=static_cast<view_gen_listdefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		kc::unparse(pds, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_printdotdefs_c_enum: {
	    view_gen_printdotdefs_c_class& kc_current_view=static_cast<view_gen_printdotdefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\n#ifndef KC_PRINTDOT_LABELSIZE\
\n# define KC_PRINTDOT_LABELSIZE 1023\
\n#endif\
\n\
\nclass impl_kc_dotedgenode_t\
\n{\
\npublic:\
\n    impl_kc_dotedgenode_t(c_abstract_phylum from,c_abstract_phyl"), kc_current_view );
		  kc_printer(kc_t("um to, int _son_nr):\
\n	ptr_from(from), ptr_to(to), son_nr(_son_nr), label(0), lsize(0), next(0) { }\
\n    c_abstract_phylum ptr_from;\
\n    c_abstract_phylum ptr_to;\
\n    int son_nr;\
\n    char "), kc_current_view );
		  kc_printer(kc_t("*label;\
\n    int lsize;\
\n    kc_dotedgenode_t next;\
\n};\
\n\
\nstatic kc_dotedgenode_t\
\nkc_mkdotedgenode(struct kc_dotedge_ht*, c_abstract_phylum, c_abstract_phylum, int);\
\nstatic void kc_do_"), kc_current_view );
		  kc_printer(kc_t("printdot_do_add_edge (c_abstract_phylum, c_abstract_phylum, int, int*, kc_dotedgenode_t*, const char*);\
\nstatic void kc_do_printdot_subgraph_prologue (FILE*, c_abstract_phylum, const char*, const cha"), kc_current_view );
		  kc_printer(kc_t("r*, bool, bool);\
\nstatic void kc_do_printdot_subgraph_epilogue (FILE*);\
\nstatic void kc_do_printdot_genfields (FILE*, int, bool);\
\nstatic void kc_do_printdot_edges (FILE*, kc_dotedgenode_t, const"), kc_current_view );
		  kc_printer(kc_t(" char*, bool);\
\n\
\nstatic bool\
\nkc_dotedge_less(kc_dotedgenode_t p1, kc_dotedgenode_t p2)\
\n{\
\n    if(p2==0)\
\n	return false;\
\n    if(p1==0)\
\n	return true;\
\n    if(p1->ptr_from<p2->ptr_f"), kc_current_view );
		  kc_printer(kc_t("rom)\
\n	return true;\
\n    if(p1->ptr_from>p2->ptr_from)\
\n	return false;\
\n    if(p1->ptr_to<p2->ptr_to)\
\n	return true;\
\n    if(p1->ptr_to>p2->ptr_to)\
\n	return false;\
\n    if(p1->son_nr<p2"), kc_current_view );
		  kc_printer(kc_t("->son_nr)\
\n	return true;\
\n    // OPERATORHASH((unsigned) kc_phy_from);\
\n    // OPERATORHASH((unsigned) kc_phy_to);\
\n    return false;\
\n}\
\n\
\ntemplate<typename T>\
\nstruct dotedge_less : s"), kc_current_view );
		  kc_printer(kc_t("td::binary_function<T, T, bool> {\
\n    bool operator()(const T& X, const T& Y) const { return kc_dotedge_less(X,Y); }\
\n};\
\n\
\nstruct kc_dotedge_ht: public std::set<kc_dotedgenode_t, dotedge_less"), kc_current_view );
		  kc_printer(kc_t("<kc_dotedgenode_t> > {\
\n	~kc_dotedge_ht() {\
\n		for(iterator i=begin();i!=end();++i)\
\n			delete const_cast<kc_dotedgenode_t>(*i);\
\n		clear();\
\n	}\
\n    kc_dotedgenode_t check_insert(kc_dotedg"), kc_current_view );
		  kc_printer(kc_t("enode_t t) {\
\n        std::pair<iterator,bool> res=insert(t);\
\n        return *res.first;\
\n    }\
\n};\
\n\
\nstatic kc_dotedge_ht* fprintdot_hashtable;\
\n"), kc_current_view); }
		kc::unparse(pds, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n\
\nkc_dotedgenode_t\
\nkc_mkdotedgenode(kc_dotedge_ht* kc_a_ht, c_abstract_phylum kc_s_from, c_abstract_phylum kc_s_to, int kc_son_nr)\
\n{\
\n    kc_dotedgenode_t kc_x = new impl_kc_dotedgenode_t"), kc_current_view );
		  kc_printer(kc_t("(kc_s_from,kc_s_to,kc_son_nr);\
\n 	kc_dotedgenode_t unique_kc_x=kc_a_ht->check_insert(kc_x);\
\n	if(unique_kc_x!=kc_x) {\
\n		delete kc_x;\
\n		kc_x=unique_kc_x;\
\n	}\
\n    return kc_x;\
\n}\
\n\
\n"), kc_current_view );
		  kc_printer(kc_t("void kc_do_printdot_subgraph_prologue(FILE *kc_f, c_abstract_phylum kc_p, const char *root_label_prefix, const char *edge_attributes, bool print_node_labels, bool use_context_when_sharing_leaves)\
\n{\
\n"), kc_current_view );
		  kc_printer(kc_t("    if (!kc_f) kc_f = stdout;\
\n    fprintf(kc_f, \"/*subgraph*/ {\\n\");\
\n    if (root_label_prefix) {\
\n	fprintf(kc_f, \"\\\"%s\\\" [shape=ellipse\", root_label_prefix);\
\n	if (edge_attributes &"), kc_current_view );
		  kc_printer(kc_t("& (strlen(edge_attributes) > 0)) {\
\n	    fprintf(kc_f, \", %s\", edge_attributes);\
\n	}\
\n	if (print_node_labels) {\
\n	    fprintf(kc_f, \", label=\\\"%s\\\\n%s\\\"\", root_label_prefix, phylum_in"), kc_current_view );
		  kc_printer(kc_t("fo[kc_p->phylum()].name);\
\n	}\
\n	fprintf(kc_f, \"];\\n\");\
\n	fprintf(kc_f, \"\\\"%s\\\" ->\", root_label_prefix);\
\n	kc_p->do_printdot_id(kc_f, use_context_when_sharing_leaves, 0, 0);\
\n	if (edg"), kc_current_view );
		  kc_printer(kc_t("e_attributes && (strlen(edge_attributes) > 0)) {\
\n	    fprintf(kc_f, \"[%s]\", edge_attributes);\
\n	}\
\n	fprintf(kc_f, \";\\n\");\
\n    }\
\n}\
\n\
\nvoid kc_do_printdot_subgraph_epilogue(FILE *kc"), kc_current_view );
		  kc_printer(kc_t("_f)\
\n{\
\n    if (!kc_f) kc_f = stdout;\
\n    fprintf(kc_f, \"}\\n\");\
\n}\
\n\
\nvoid fprintdotprologue(FILE *kc_f)\
\n{\
\n    if (!kc_f) kc_f = stdout;\
\n    fprintf(kc_f, \"digraph kc_output{\\n"), kc_current_view );
		  kc_printer(kc_t("\");\
\n    fprintf(kc_f, \"node [shape=record, height=.1, fontname=Helvetica];\\n\");\
\n}\
\n\
\nvoid fprintdotepilogue(FILE *kc_f)\
\n{\
\n    if (!kc_f) kc_f = stdout;\
\n    fprintf(kc_f, \"}\\n\""), kc_current_view );
		  kc_printer(kc_t(");\
\n}\
\n\
\nvoid kc_do_printdot_genfields(FILE *kc_f, int kc_prodsel, bool print_node_labels)\
\n{\
\n  int kc_i = 1;\
\n  KC_OPERATOR_INFO *kc_op_info = &operator_info[kc_prodsel];\
\n  if (kc_op_i"), kc_current_view );
		  kc_printer(kc_t("nfo->no_sons <= 0) return;\
\n  if (!kc_f) kc_f = stdout;\
\n  while(kc_i < kc_op_info->no_sons) {\
\n    fprintf(kc_f, \"<f%d>\", kc_i);\
\n    if (print_node_labels) {\
\n      fprintf(kc_f, \"%s\", "), kc_current_view );
		  kc_printer(kc_t("phylum_info[kc_op_info->subphylum[kc_i-1]].name);\
\n    }\
\n    fprintf(kc_f, \"|\");\
\n    kc_i++;\
\n  }\
\n  fprintf(kc_f, \"<f%d>\", kc_i);\
\n  if (print_node_labels) {\
\n    fprintf(kc_f, \"%"), kc_current_view );
		  kc_printer(kc_t("s\", phylum_info[kc_op_info->subphylum[kc_i-1]].name);\
\n  }\
\n}\
\n\
\nvoid impl_abstract_phylum::do_printdot_id(FILE *kc_f, bool use_context_when_sharing_leaves, c_abstract_phylum kc_ctxt, int kc_s"), kc_current_view );
		  kc_printer(kc_t("on_nr) const\
\n{\
\n    // The casts only make unique ids, so reinterpret_cast is alright\
\n    if (!kc_f) kc_f = stdout;\
\n    enum_phyla kc_phy = phylum();\
\n    if (kc_phy == phylum_voidptr) {\
\n"), kc_current_view );
		  kc_printer(kc_t("	fprintf(kc_f, \"kcidp%x\", reinterpret_cast<int>(this));\
\n	if (use_context_when_sharing_leaves) {\
\n	    fprintf(kc_f, \"_%x_%d\", reinterpret_cast<int>(kc_ctxt), kc_son_nr);\
\n	}\
\n    } else if"), kc_current_view );
		  kc_printer(kc_t(" ((kc_phy == phylum_casestring) || (kc_phy == phylum_nocasestring)) {\
\n	fprintf(kc_f, \"kcids%x\", reinterpret_cast<int>(this));\
\n	if (use_context_when_sharing_leaves) {\
\n	    fprintf(kc_f, \"_%x"), kc_current_view );
		  kc_printer(kc_t("_%d\", reinterpret_cast<int>(kc_ctxt), kc_son_nr);\
\n	}\
\n    } else if (kc_phy == phylum_integer) {\
\n	fprintf(kc_f, \"kcidi%x\", reinterpret_cast<int>(this));\
\n	if (use_context_when_sharing_leav"), kc_current_view );
		  kc_printer(kc_t("es) {\
\n	    fprintf(kc_f, \"_%x_%d\", reinterpret_cast<int>(kc_ctxt), kc_son_nr);\
\n	}\
\n    } else if (kc_phy == phylum_real) {\
\n	fprintf(kc_f, \"kcidf%x\", reinterpret_cast<int>(this));\
\n	if "), kc_current_view );
		  kc_printer(kc_t("(use_context_when_sharing_leaves) {\
\n	    fprintf(kc_f, \"_%x_%d\", reinterpret_cast<int>(kc_ctxt), kc_son_nr);\
\n	}\
\n    } else {\
\n	fprintf(kc_f, \"kcidx%x\", reinterpret_cast<int>(this));\
\n}"), kc_current_view );
		  kc_printer(kc_t("   }\
\n\
\nvoid kc_do_printdot_do_add_edge(c_abstract_phylum kc_p, c_abstract_phylum kc_sub_p, int kc_son_nr, int *kc_edge_nr, kc_dotedgenode_t *kc_edges, const char *edge_label_prefix)\
\n{\
\n    kc"), kc_current_view );
		  kc_printer(kc_t("_dotedgenode_t kc_hn;\
\n    char kc_buf[30];\
\n    kc_hn = kc_mkdotedgenode(fprintdot_hashtable, kc_p, kc_sub_p, kc_son_nr);\
\n    if (! kc_hn->label) {\
\n		kc_hn->label = new char[(size_t)(KC_PRIN"), kc_current_view );
		  kc_printer(kc_t("TDOT_LABELSIZE+1)];\
\n	kc_hn->lsize = KC_PRINTDOT_LABELSIZE;\
\n	strcpy(kc_hn->label, \"\");\
\n	kc_hn->next = *kc_edges;\
\n	*kc_edges = kc_hn;\
\n    } else {\
\n	char kc_buf2[30];\
\n	sprintf(kc_bu"), kc_current_view );
		  kc_printer(kc_t("f2, \", \");\
\n	strncat(kc_hn->label, kc_buf2, kc_hn->lsize - strlen(kc_hn->label));\
\n    }\
\n    if (edge_label_prefix) {\
\n	strncat(kc_hn->label, edge_label_prefix, kc_hn->lsize - strlen(kc_hn->"), kc_current_view );
		  kc_printer(kc_t("label));\
\n    }\
\n    sprintf(kc_buf, \"%d\", *kc_edge_nr);\
\n    strncat(kc_hn->label, kc_buf, kc_hn->lsize - strlen(kc_hn->label));\
\n    (*kc_edge_nr)++;\
\n}\
\n\
\nvoid impl_abstract_phylum::"), kc_current_view );
		  kc_printer(kc_t("printdot_add_edge(c_abstract_phylum kc_sub_p, int kc_son_nr, int *kc_edge_nr, kc_dotedgenode_t *kc_edges, const char *edge_label_prefix) const\
\n{\
\n  kc_do_printdot_do_add_edge(this, kc_sub_p, kc_so"), kc_current_view );
		  kc_printer(kc_t("n_nr, kc_edge_nr, kc_edges, edge_label_prefix);\
\n}\
\n\
\nvoid kc_do_printdot_edges(FILE *kc_f, kc_dotedgenode_t kc_edges, const char *edge_attributes, bool use_context_when_sharing_leaves)\
\n{\
\n "), kc_current_view );
		  kc_printer(kc_t("   kc_dotedgenode_t kc_p = kc_edges;\
\n    if (!kc_f) kc_f = stdout;\
\n    while(kc_p) {\
\n	kc_p->ptr_from->do_printdot_id(kc_f, use_context_when_sharing_leaves, 0, 0);\
\n	fprintf(kc_f, \":f%d -> \""), kc_current_view );
		  kc_printer(kc_t(", kc_p->son_nr);\
\n	kc_p->ptr_to->do_printdot_id(kc_f, use_context_when_sharing_leaves, kc_p->ptr_from, kc_p->son_nr);\
\n	fprintf(kc_f, \" [label=\\\"%s\\\"\", kc_p->label);\
\n	if (edge_attributes &"), kc_current_view );
		  kc_printer(kc_t("& (strlen(edge_attributes) > 0)) {\
\n	    fprintf(kc_f, \", %s\", edge_attributes);\
\n	}\
\n	fprintf(kc_f, \"];\\n\");\
\n	kc_p = kc_p->next;\
\n}   }\
\n\
\nvoid impl_abstract_phylum::do_printdot(FI"), kc_current_view );
		  kc_printer(kc_t("LE *kc_f, bool kc_outmost, int *kc_edge_nr, kc_dotedgenode_t *kc_edges, const char *edge_label_prefix, bool print_node_labels, bool use_context_when_sharing_leaves, c_abstract_phylum kc_ctxt, int kc_so"), kc_current_view );
		  kc_printer(kc_t("n_nr) const\
\n{\
\n    int kc_i;\
\n\
\n    if (!kc_f) kc_f = stdout;\
\n    switch(phylum()) {\
\n	case phylum_voidptr:\
\n	    do_printdot_id(kc_f, use_context_when_sharing_leaves, kc_ctxt, kc_son_n"), kc_current_view );
		  kc_printer(kc_t("r);\
\n	    fprintf(kc_f, \" [label=\\\"%p\\\", shape=ellipse];\\n\", dynamic_cast<c_voidptr>(this)->pointer);\
\n	    break;\
\n	case phylum_casestring:\
\n	case phylum_nocasestring:\
\n	    do_printd"), kc_current_view );
		  kc_printer(kc_t("ot_id(kc_f, use_context_when_sharing_leaves, kc_ctxt, kc_son_nr);\
\n#ifdef KC_UNICODE\
\n	    fprintf(kc_f, \" [label=\\\"%s\\\", shape=ellipse];\\n\", kc_to_cstring(static_cast<c_casestring>(this)->n"), kc_current_view );
		  kc_printer(kc_t("ame).c_str());\
\n#else\
\n	    fprintf(kc_f, \" [label=\\\"%s\\\", shape=ellipse];\\n\", static_cast<c_casestring>(this)->name);\
\n#endif\
\n	    break;\
\n	case phylum_integer:\
\n	    do_printdot_i"), kc_current_view );
		  kc_printer(kc_t("d(kc_f, use_context_when_sharing_leaves, kc_ctxt, kc_son_nr);\
\n	    fprintf(kc_f, \" [label=\\\"%i\\\", shape=ellipse];\\n\", ((integer)this)->value);\
\n	    break;\
\n	case phylum_real:\
\n	    do_"), kc_current_view );
		  kc_printer(kc_t("printdot_id(kc_f, use_context_when_sharing_leaves, kc_ctxt, kc_son_nr);\
\n	    fprintf(kc_f, \" [label=\\\"%f\\\", shape=ellipse];\\n\", ((real)this)->value);\
\n	    break;\
\n	default:\
\n	    if (!"), kc_current_view );
		  kc_printer(kc_t("subphylum(0)) {\
\n		do_printdot_id(kc_f, use_context_when_sharing_leaves, kc_ctxt, kc_son_nr);\
\n		fprintf(kc_f, \" [label=\\\"<f0>%s\\\"];\\n\", op_name());\
\n	    } else {\
\n		do_printdot_id(kc_f"), kc_current_view );
		  kc_printer(kc_t(", use_context_when_sharing_leaves, kc_ctxt, kc_son_nr);\
\n		fprintf(kc_f, \" [label=\\\"{<f0>%s|{\", op_name());\
\n			kc_do_printdot_genfields(kc_f, prod_sel(), print_node_labels);\
\n		fprintf(kc_f,"), kc_current_view );
		  kc_printer(kc_t(" \"}}\\\"];\\n\");\
\n                abstract_phylum child;\
\n		for (kc_i=0; (child = subphylum(kc_i)); kc_i++) {\
\n		    printdot_add_edge(child, kc_i+1, kc_edge_nr, kc_edges, edge_label_prefix );\
\n"), kc_current_view );
		  kc_printer(kc_t("		    child->do_printdot( kc_f, false, kc_edge_nr, kc_edges, edge_label_prefix, print_node_labels, use_context_when_sharing_leaves, this, kc_i+1 );\
\n		}\
\n	    }\
\n    }\
\n}\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_printdotdecls_h_enum: {
	    view_gen_printdotdecls_h_class& kc_current_view=static_cast<view_gen_printdotdecls_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\nvoid fprintdotprologue ( FILE* );\
\nvoid fprintdotepilogue ( FILE* );\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_error_defs_c_enum: {
	    view_gen_error_defs_c_class& kc_current_view=static_cast<view_gen_error_defs_c_class&>(kc_current_view_base);
	    {
		const char *strof_phylum_error="Internal Error: unknown phylum number: ";
		int strlen_strof_phylum_error = static_cast<int>(strlen(strof_phylum_error)+30);
		casestring cstrof_phylum_error = mkcasestring(strof_phylum_error);
		const char *strof_operator_error="Internal Error: unknown operator number: ";
		int strlen_strof_operator_error = static_cast<int>(strlen(strof_operator_error)+30);
		casestring cstrof_operator_error = mkcasestring(strof_operator_error);

		{ kc_printer(kc_t("const char*\
\nphylumname_or_error(enum_phyla kc_phy)\
\n{\
\n    if ((kc_phy <= one_before_first_phylum) || (kc_phy >= last_phylum)) {\
\n	char *kc_strof_error;\
\n	sprintf((kc_strof_error=new char["), kc_current_view); }
		kc::unparse(strlen_strof_phylum_error, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]), \""), kc_current_view); }
		kc::unparse(cstrof_phylum_error, kc_printer, kc_current_view);
		{ kc_printer(kc_t("%d\", kc_phy);\
\n	return kc_strof_error;\
\n    } else {\
\n	return phylum_info[kc_phy].name;\
\n}   }\
\n\
\n\
\nconst char*\
\nkc_operatorname_or_error(enum_operators kc_operator)\
\n{\
\n    if ((k"), kc_current_view );
		  kc_printer(kc_t("c_operator <= one_before_first_operator) || (kc_operator >= last_operator)) {\
\n	char *kc_strof_error;\
\n	sprintf((kc_strof_error=new char["), kc_current_view); }
		kc::unparse(strlen_strof_operator_error, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]), \""), kc_current_view); }
		kc::unparse(cstrof_operator_error, kc_printer, kc_current_view);
		{ kc_printer(kc_t("%d\", kc_operator);\
\n	return kc_strof_error;\
\n    } else {\
\n	return operator_info[kc_operator].name;\
\n}   }\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_error_decls_h_enum: {
	    view_gen_error_decls_h_class& kc_current_view=static_cast<view_gen_error_decls_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("const char *phylumname_or_error ( enum_phyla );\
\nconst char *kc_operatorname_or_error ( enum_operators );\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_access_functions_enum: {
	    view_gen_access_functions_class& kc_current_view=static_cast<view_gen_access_functions_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\nabstract_phylum\
\nkc_create(enum_operators createOp"), kc_current_view); }
		int j=Theargsnumbers->last()->value;
		if (j<2) j=2; 
		for (int i = 1; i<=j; ++i) 
		{
		    { kc_printer(kc_t(", abstract_phylum"), kc_current_view); }
		    { kc_printer(kc_t(" kc_p"), kc_current_view); }
		    kc::unparse(i, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t(")\
\n{\
\n    switch(createOp) {\r\
\n    case sel__VoidPtr:\
\n    case sel__Int:\
\n    case sel__Real:\
\n    case sel__Str:\
\n    case sel_NoCaseStr:\v\
\n	assertionFailed(\"Cannot create this kin"), kc_current_view );
		  kc_printer(kc_t("d of phylum - predefined phyla must be handled seperately\");break;\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, view_gen_create_function);
		{ kc_printer(kc_t("   \rdefault:\v\
\n	assertionFailed(\"Cannot create this kind of phylum - unkown operator id\");\
\n    }\
\n    NORETURN\
\n}\
\n\
\nabstract_phylum&\
\nattributeOf(abstract_phylum kc_p, int no)\
\n{\
\n"), kc_current_view); }



		count_printer counter;
		d->unparse(counter, view_gen_attributeOf_function);
		if (counter()==0) 
		{
		    { kc_printer(kc_t("assertionFailed(\"Cannot select attribute for this kind of phylum - has no attributes\");\
\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("   enum_operators kc_op = kc_p->prod_sel();\
\n    switch (kc_op) {\r\
\n"), kc_current_view); }
		    kc::unparse(d, kc_printer, view_gen_attributeOf_function);
		    { kc_printer(kc_t("   default:\v\
\n	assertionFailed(\"Cannot select attribute for this kind of phylum - unkown operator id or no attributes\");\
\n    }\
\n    assertionFailed(\"Cannot select attribute for this kind of"), kc_current_view );
		  kc_printer(kc_t(" phylum - attribute number out of range\");\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    NORETURN\
\n}\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatordefs_c_enum: {
	    view_gen_operatordefs_c_class& kc_current_view=static_cast<view_gen_operatordefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		kc::unparse(Thestorageclasses, kc_printer, view_gen_operatordefs_c_0);
		{ kc_printer(kc_t("\
\nbool kc_storageclass_still_uniq[] = {\
\n"), kc_current_view); }
		kc::unparse(Thestorageclasses, kc_printer, view_gen_operatordefs_c_1);
		{ kc_printer(kc_t(" };\
\n\
\nhashtable_t hashtables[] = {\
\n"), kc_current_view); }
		kc::unparse(Thestorageclasses, kc_printer, view_gen_operatordefs_c_2);
		{ kc_printer(kc_t("};\
\n\
\nconst char* kc_storageclassnames[] = { "), kc_current_view); }
		kc::unparse(Thestorageclasses, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" };\
\n\
\nnamespace { // all local to k.cc\
\n\r\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t("\
\n} // namespace\
\n\
\nenum_phyla\
\nimpl_abstract_phylum::phylum() const {\
\n	return operator_info[prod_sel()].phylum;\
\n}\
\n\
\nconst char*\
\nimpl_abstract_phylum::phylum_name() const {\
\n	re"), kc_current_view );
		  kc_printer(kc_t("turn phylum_info[phylum()].name;\
\n}\
\n\
\nconst char*\
\nimpl_abstract_phylum::op_name() const {\
\n	return operator_info[prod_sel()].name;\
\n}\
\n\
\ncasestring\
\nmkcasestring(const kc_char_t *kc"), kc_current_view );
		  kc_printer(kc_t("_s, int length)\
\n{\
\n    KC_COLLECT_STATS0(KC_CREATE_STATS(sel__Str));\
\n\
\n    casestring"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("_ptr"), kc_current_view); }
		}
		{ kc_printer(kc_t(" kc_x=new impl_casestring__Str(kc_s);\
\n    if(length>=0) \
\n		kc_x->make_own(length);\
\n	\
\n    casestring unique_kc_x=hashtables[uniq]->ht_check_insert((casestring)kc_x);\
\n    if(unique_kc_x!=k"), kc_current_view );
		  kc_printer(kc_t("c_x) {\
\n		if(length<0) \
\n	kc_x->name=0;\
\n\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	delete kc_x;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	kc_x=unique_kc_x;\
\n    } else {\
\n	KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel__Str));\
\n		if(length<0) \
\n			kc_x->make_own(static_cast<int>(kc_strlen(kc_s)));\
\n\
\n	kc_x->post_create();\
\n"), kc_current_view );
		  kc_printer(kc_t("    }\
\n    return kc_x;\
\n}\
\n\
\nnocasestring\
\nmknocasestring(const kc_char_t *kc_s, int length)\
\n{\
\n    KC_COLLECT_STATS0(KC_CREATE_STATS(sel_NoCaseStr));\
\n\
\n    nocasestring"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("_ptr"), kc_current_view); }
		}
		{ kc_printer(kc_t(" kc_x=new impl_nocasestring_NoCaseStr(kc_s);\
\n	if(length>=0)\
\n		kc_x->make_own(length);\
\n    nocasestring unique_kc_x=hashtables[uniq]->ht_check_insert((nocasestring)kc_x);\
\n    if(unique_kc_x!"), kc_current_view );
		  kc_printer(kc_t("=kc_x) {\
\n		if(length<0)\
\n	kc_x->name=0;\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	delete kc_x;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	kc_x=unique_kc_x;\
\n    } else {\
\n	KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel_NoCaseStr));\
\n		if(length<0)\
\n			kc_x->make_own(static_cast<int>(kc_strlen(kc_s)));\
\n	kc_x->post_create();\
\n"), kc_current_view );
		  kc_printer(kc_t("    }\
\n\
\n    return kc_x;\
\n}\
\n\
\ninteger\
\nmkinteger(const INTEGER kc_i)\
\n{\
\n    KC_COLLECT_STATS0(KC_CREATE_STATS(sel__Int));\
\n\
\n    integer kc_x =new impl_integer__Int(kc_i);\
\n   "), kc_current_view );
		  kc_printer(kc_t(" integer unique_kc_x=hashtables[uniq]->ht_check_insert(kc_x);\
\n    if(unique_kc_x!=kc_x) {\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	delete kc_x;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	kc_x=unique_kc_x;\
\n    } else {\
\n	KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel__Int));\
\n	kc_x->post_create();\
\n    }\
\n\
\n    return kc_x;\
\n}\
\n\
\nreal\
\nmkreal(const REAL kc_r)\
\n{"), kc_current_view );
		  kc_printer(kc_t("\
\n    KC_COLLECT_STATS0(KC_CREATE_STATS(sel__Real));\
\n\
\n    real kc_x=new impl_real__Real(kc_r);\
\n    real unique_kc_x=hashtables[uniq]->ht_check_insert(kc_x);\
\n    if(unique_kc_x!=kc_x) {\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	delete kc_x;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	kc_x=unique_kc_x;\
\n    } else {\
\n	KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel__Real));\
\n	kc_x->post_create();\
\n    }\
\n\
\n    return kc_x;\
\n}\
\n\
\nvoidptr\
\nmkvoidptr(void *kc_p)\
"), kc_current_view );
		  kc_printer(kc_t("\n{\
\n    KC_COLLECT_STATS0(KC_CREATE_STATS(sel__VoidPtr));\
\n    voidptr kc_x=new impl_voidptr__VoidPtr(kc_p);\
\n    voidptr unique_kc_x=hashtables[uniq]->ht_check_insert(kc_x);\
\n    if(unique_kc"), kc_current_view );
		  kc_printer(kc_t("_x!=kc_x) {\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	delete kc_x;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	kc_x=unique_kc_x;\
\n    } else {\
\n       KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel__VoidPtr));\
\n	kc_x->post_create();\
\n    }\
\n    return kc_x;\
\n}\
\n\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		kc::unparse(this, kc_printer, view_gen_access_functions);
		{ kc_printer(kc_t("\
\nabstract_phylum\
\nimpl_abstract_phylum::subphylum(int) const\
\n{\
\n  return 0;\
\n}\
\n\
\nvoid\
\nimpl_abstract_phylum::set_subphylum(int,abstract_phylum)\
\n{\
\n}\
\n\
\nvoid\
\nimpl_abstract"), kc_current_view );
		  kc_printer(kc_t("_phylum::free(bool kc_rec)\
\n{\
\n    KC_COLLECT_STATS0(KC_FREE_CALLED_STATS(prod_sel(), kc_rec));\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	if(get_ref())\
\n		get_ref()->unlock();\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    if (!"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("get_ref()"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("phylum_info[phylum()].uniq_stored"), kc_current_view); }
		}
		{ kc_printer(kc_t(") {\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	if (kc_rec) {\
\n            abstract_phylum son;\
\n	    for (int kc_i=0; (son = subphylum(kc_i)); kc_i++)\
\n	    {\
\n		if (son!=0) son->free(kc_rec);\
\n		son=0;\
\n	    }\
\n	}\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	KC_COLLECT_STATS0(KC_FREED_STATS(prod_sel(), kc_rec));\
\n	delete this;\
\n	}\
\n}\
\n\
\nbool\
\nimpl_abstract_phylum::eq(c_abstract_phylum kc_p2) const\
\n{\
\n    if (this == kc_p2)\
\n		return tru"), kc_current_view );
		  kc_printer(kc_t("e;\
\n    if (prod_sel() != kc_p2->prod_sel())\
\n		return false;\
\n\
\n    int kc_st = phylum_info[phylum()].uniq_stored;\
\n    if (kc_st && kc_storageclass_still_uniq[kc_st])\
\n		return false;\
\n"), kc_current_view );
		  kc_printer(kc_t("\
\n    c_abstract_phylum son1;\
\n    for (int kc_i=0; (son1 = subphylum(kc_i)); kc_i++) {\
\n	if (!son1->eq(kc_p2->subphylum(kc_i)))\
\n	    return false;\
\n    }\
\n\
\n    return true;\
\n}\
\n\
\n"), kc_current_view );
		  kc_printer(kc_t("static string kc_indentation = \"\";\
\nstatic const char *kc_printformat_not_nullary_open = \"%s%s(\\n\";\
\nstatic const char *kc_printformat_list_open = \"%s%s\\n\";\
\n\
\nstatic const char *kc_pri"), kc_current_view );
		  kc_printer(kc_t("ntformat_not_nullary_close = \"%s)\\n\";\
\nstatic const char *kc_printformat_nullary = \"%s%s()\\n\";\
\n\
\nvoid\
\nimpl_abstract_phylum::fprint(FILE*kc_f)\
\n{\
\n    int kc_i;\
\n\
\n    if (!kc_f)"), kc_current_view );
		  kc_printer(kc_t(" kc_f = stdout;\
\n    abstract_list al = dynamic_cast<abstract_list>(this);\
\n    if (al != 0 && !al->is_nil()) {\
\n	fprintf(kc_f, kc_printformat_list_open, kc_indentation.c_str(), op_name());\
\n	k"), kc_current_view );
		  kc_printer(kc_t("c_indentation+=\"| \";\
\n	subphylum(0)->fprint(kc_f);\
\n	kc_indentation=kc_indentation.substr(0, kc_indentation.length()-2);\
\n	phylum_cast<abstract_list>(subphylum(1))->fprint_list(kc_f);\
\n	kc_in"), kc_current_view );
		  kc_printer(kc_t("dentation=kc_indentation.substr(0, kc_indentation.length()-2);\
\n    } else // not list\
\n    switch(phylum()) {\
\n	case phylum_voidptr:\
\n	    \vfprintf(kc_f, \"%s%p\\n\", kc_indentation.c_str(), "), kc_current_view );
		  kc_printer(kc_t("static_cast<voidptr>(this)->pointer);\
\n	    break;\r\
\n	case phylum_casestring:\
\n	case phylum_nocasestring:\
\n	    \vfprintf(kc_f, \"%s%s\\n\", kc_indentation.c_str(), static_cast<casestring>(thi"), kc_current_view );
		  kc_printer(kc_t("s)->name);\
\n	    break;\r\
\n	case phylum_integer:\
\n	    \vfprintf(kc_f, \"%s%i\\n\", kc_indentation.c_str(), static_cast<integer>(this)->value);\
\n	    break;\r\
\n	case phylum_real:\
\n	    \vfp"), kc_current_view );
		  kc_printer(kc_t("rintf(kc_f, \"%s%f\\n\", kc_indentation.c_str(), static_cast<real>(this)->value);\
\n	    break;\r\
\n	default:\
\n	    \vif (!subphylum(0)) {\
\n		fprintf(kc_f, kc_printformat_nullary, kc_indentation."), kc_current_view );
		  kc_printer(kc_t("c_str(), op_name());\
\n	    } else {\
\n		fprintf(kc_f, kc_printformat_not_nullary_open, kc_indentation.c_str(), op_name());\
\n		kc_indentation+=\"  \";\
\n		abstract_phylum son;\
\n		for (kc_i=0; (s"), kc_current_view );
		  kc_printer(kc_t("on = subphylum(kc_i)); kc_i++) {\
\n		    son->fprint(kc_f);\
\n		}\
\n		kc_indentation=kc_indentation.substr(0, kc_indentation.length()-2);\
\n		fprintf(kc_f, kc_printformat_not_nullary_close, kc_inde"), kc_current_view );
		  kc_printer(kc_t("ntation.c_str());\
\n	    }\r\
\n    }\
\n}\
\n\
\nvoid \
\nimpl_abstract_phylum::print()\
\n{\
\n  fprint(stdout);\
\n}\
\n\
\nvoid \
\nimpl_abstract_list::fprint_list(FILE*kc_f)\
\n{\
\n    if (!kc_f"), kc_current_view );
		  kc_printer(kc_t(")\
\n	kc_f = stdout;\
\n    if (this->is_nil()) {\
\n	kc_indentation+=\"`-\";\
\n	fprintf(kc_f, kc_printformat_nullary, kc_indentation.c_str(), op_name());\
\n    } else {\
\n	kc_indentation+=\"|-\";\
\n"), kc_current_view );
		  kc_printer(kc_t("	fprintf(kc_f, kc_printformat_list_open, kc_indentation.c_str(), op_name());\
\n	kc_indentation=kc_indentation.substr(0, kc_indentation.length()-2);\
\n	kc_indentation+=\"| \";\
\n	subphylum(0)->fprint"), kc_current_view );
		  kc_printer(kc_t("(kc_f);\
\n	kc_indentation=kc_indentation.substr(0, kc_indentation.length()-2);\
\n	phylum_cast<abstract_list>(subphylum(1))->fprint_list(kc_f);\
\n    }\
\n}\
\n\
\nint\
\nimpl_abstract_list::length()"), kc_current_view );
		  kc_printer(kc_t(" const\
\n{\
\n    int kc_length = 0;\
\n    c_abstract_phylum kc_p = this;\
\n    while((kc_p = kc_p->subphylum(1)))\
\n	kc_length++;\
\n    return kc_length;\
\n}\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("void impl_abstract_list::freelist() { }\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("void impl_abstract_list::freelist()\
\n{\
\n    abstract_phylum kc_p = this, kc_tmp_p;\
\n    do {\
\n	kc_tmp_p=kc_p->subphylum(1);\
\n	kc_p->free(false);\
\n	kc_p=kc_tmp_p;\
\n    } while(kc_p);\
\n}\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("abstract_phylum\
\nimpl_abstract_list::do_concat(c_abstract_phylum kc_p2, enum_operators mk) const\
\n{\
\n    abstract_phylum next = subphylum(1);\
\n    if(!next)\
\n	return const_cast<abstract_phyl"), kc_current_view );
		  kc_printer(kc_t("um>(kc_p2);\
\n    return kc_create(mk, subphylum(0), static_cast<abstract_list>(next)->do_concat(kc_p2, mk));\
\n}\
\n\
\nabstract_phylum\
\nimpl_abstract_list::do_reverse(c_abstract_phylum tail, enum"), kc_current_view );
		  kc_printer(kc_t("_operators mk) const\
\n{\
\n    for (impl_abstract_list const* iterator_ = this; iterator_->subphylum(1) != 0;\
\n	    iterator_ = static_cast<impl_abstract_list const*>(iterator_->subphylum(1)) )\
\n"), kc_current_view );
		  kc_printer(kc_t("	tail = kc_create(mk, iterator_->subphylum(0), const_cast<abstract_phylum>(tail));\
\n    return const_cast<abstract_phylum>(tail);\
\n}\
\n\
\nabstract_phylum\
\nimpl_abstract_list::last() const\
\n{\
\n"), kc_current_view );
		  kc_printer(kc_t("    c_abstract_phylum kc_p = this, next = subphylum(1), nextnext;\
\n#ifdef _AFX\
\n    ASSERT(next);\
\n    if(!next)\
\n	return NULL;\
\n#else\
\n    if(!next){\
\n	fflush(stdout);\
\n	fprintf(stderr"), kc_current_view );
		  kc_printer(kc_t(", \"Internal Error: list::last was called with argument Nil%s\\n\", phylum_name());\
\n	exit(1);\
\n    }\
\n#endif\
\n    while ((nextnext = next->subphylum(1))) {\
\n	kc_p = next;\
\n	next = nextnext"), kc_current_view );
		  kc_printer(kc_t(";\
\n    }\
\n    return const_cast<abstract_phylum>(kc_p->subphylum(0));/* XXX remove cast */\
\n}\
\n\
\nabstract_phylum\
\nimpl_abstract_list::do_map(abstract_phylum (*kc_fp)(abstract_phylum), enum_"), kc_current_view );
		  kc_printer(kc_t("operators mk)\
\n{\
\n    abstract_phylum el = subphylum(0);\
\n    if (!el)\
\n	return this;\
\n    abstract_list next = static_cast<abstract_list>(subphylum(1));\
\n    return kc_create(mk, kc_fp(el)"), kc_current_view );
		  kc_printer(kc_t(", next->do_map(kc_fp, mk));\
\n}\
\n\
\nabstract_phylum\
\nimpl_abstract_list::do_filter(bool (*kc_fp)(abstract_phylum), enum_operators mk)\
\n{\
\n    abstract_phylum el = subphylum(0);\
\n    if (!el"), kc_current_view );
		  kc_printer(kc_t(")\
\n	return this;\
\n    abstract_list next = static_cast<abstract_list>(subphylum(1));\
\n    if ((*kc_fp)(el)) {\
\n	return kc_create(mk, el, next->do_filter(kc_fp, mk));\
\n    } else {\
\n	return "), kc_current_view );
		  kc_printer(kc_t("next->do_filter(kc_fp, mk);\
\n    }\
\n}\
\n\
\nabstract_list\
\nimpl_abstract_list::do_append(abstract_phylum new_last, abstract_list eol)\
\n{\
\n    abstract_list next = this;\
\n    while (!next->"), kc_current_view );
		  kc_printer(kc_t("is_nil())\
\n	next = phylum_cast<abstract_list>(next->subphylum(1));\
\n    next->set_subphylum(0, new_last);\
\n    next->set_subphylum(1, eol);\
\n    return next;\
\n}\
\n\
\nabstract_phylum\
\nimpl"), kc_current_view );
		  kc_printer(kc_t("_abstract_list::do_merge(abstract_list second,abstract_phylum(*kc_fp)(abstract_phylum,abstract_phylum), enum_operators mk)\
\n{\
\n    abstract_phylum el = subphylum(0);\
\n    if (!el)\
\n	return this"), kc_current_view );
		  kc_printer(kc_t(";\
\n    abstract_phylum el2 = second->subphylum(0);\
\n    if (!el2)\
\n	return el2;\
\n    abstract_list next = static_cast<abstract_list>(subphylum(1));\
\n    abstract_list next2 = static_cast<abst"), kc_current_view );
		  kc_printer(kc_t("ract_list>(second->subphylum(1));\
\n    return kc_create(mk, kc_fp(el,el2), next->do_merge(next2, kc_fp, mk));\
\n}\
\n\
\nabstract_phylum\
\nimpl_abstract_list::do_reduce(abstract_phylum neutral, abs"), kc_current_view );
		  kc_printer(kc_t("tract_phylum(*kc_fp)(abstract_phylum,abstract_phylum)) {\
\n    abstract_phylum el = subphylum(0);\
\n    if (!el)\
\n	return neutral;\
\n    abstract_list next = static_cast<abstract_list>(subphylum(1"), kc_current_view );
		  kc_printer(kc_t("));\
\n    return kc_fp(el,next->do_reduce(neutral,kc_fp));\
\n}\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#ifndef KC_OPERATOR_CAST_HEADER\
\n#define KC_OPERATOR_CAST_HEADER\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"         // in case a user forgets\
\n#include <typeinfo>   // for bad_cast\
\n\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("#endif // KC_OPERATOR_CAST_HEADER\n\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\ncasestring mkcasestring( const kc_char_t *, int length = -1);\
\nnocasestring mknocasestring( const kc_char_t *, int length = -1);\
\ninteger mkinteger( const INTEGER );\
\nreal mkreal( const REAL "), kc_current_view );
		  kc_printer(kc_t(");\
\ninline casestring _Str( const kc_char_t * cc) { return mkcasestring(cc); }\
\ninline nocasestring NoCaseStr( const kc_char_t * cc) { return mknocasestring(cc); }\
\ninline integer _Int( const INT"), kc_current_view );
		  kc_printer(kc_t("EGER cc) { return mkinteger(cc); }\
\ninline real _Real( const REAL cc) { return mkreal(cc); }\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_assertmacros_c_enum: {
	    view_gen_assertmacros_c_class& kc_current_view=static_cast<view_gen_assertmacros_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\nvoid\
\nkc_no_default_in_with( const char *kc_func, int kc_line, const char *kc_file )\
\n{\
\n    fflush(stdout);\
\n#ifdef _AFX\
\n	USES_CONVERSION;\
\n	const _TCHAR* format=A2CT(KC_NO_DEFAULT_IN"), kc_current_view );
		  kc_printer(kc_t("_WITH);\
\n	const _TCHAR* tkc_func=A2CT(kc_func);\
\n	const _TCHAR* tkc_file=A2CT(kc_file);\
\n	TRACE( format, tkc_func, tkc_file, kc_line );\
\n#ifdef _DEBUG\
\n    if (AfxAssertFailedLine(kc_file, kc"), kc_current_view );
		  kc_printer(kc_t("_line))\
\n#endif\
\n	AfxDebugBreak();\
\n#else\
\n    fprintf( stderr, KC_NO_DEFAULT_IN_WITH, kc_func, kc_file, kc_line );\
\n#ifndef KC_NODEFAULT_NO_ABORT\
\n    abort();\
\n#else\
\n    exit( 1 );\
\n"), kc_current_view );
		  kc_printer(kc_t("#endif\
\n#endif\
\n}\
\n\
\nvoid\
\nkc_returnless_function( const char *kc_func, int kc_line, const char *kc_file )\
\n{\
\n    fflush(stdout);\
\n#ifdef _AFX\
\n	USES_CONVERSION;\
\n	const _TCHAR* fo"), kc_current_view );
		  kc_printer(kc_t("rmat=_T(\"Internal Error: function %s does not return a value, at %s:%d\");\
\n	const _TCHAR* tkc_func=A2CT(kc_func);\
\n	const _TCHAR* tkc_file=A2CT(kc_file);\
\n	TRACE( format, tkc_func, tkc_file, kc"), kc_current_view );
		  kc_printer(kc_t("_line );\
\n#ifdef _DEBUG\
\n    if (AfxAssertFailedLine(kc_file, kc_line))\
\n#endif\
\n	AfxDebugBreak();\
\n#else\
\n    fprintf( stderr, \"Internal Error: function %s does not return a value, at %s:"), kc_current_view );
		  kc_printer(kc_t("%d\", kc_func, kc_file, kc_line );\
\n#ifndef KC_NODEFAULT_NO_ABORT\
\n    abort();\
\n#else\
\n    exit( 1 );\
\n#endif\
\n#endif\
\n}\
\n\
\nvoid\
\nkc_assertionFailed(const char *kc_fn, int kc_l)\
\n"), kc_current_view );
		  kc_printer(kc_t("{\
\n    fflush(stdout);\
\n#ifdef _AFX\
\n	USES_CONVERSION;\
\n	const _TCHAR* format=_T(\"Internal Error: Assertion failed at %s:%d\\n\");\
\n	const _TCHAR* tkc_func=A2CT(kc_fn);\
\n	TRACE( format, tk"), kc_current_view );
		  kc_printer(kc_t("c_func, kc_l );\
\n#ifdef _DEBUG\
\n    if (AfxAssertFailedLine(kc_fn, kc_l))\
\n#endif\
\n	AfxDebugBreak();\
\n#else\
\n    fprintf( stderr, \"Internal Error: Assertion failed at %s:%d\\n\", kc_fn, kc"), kc_current_view );
		  kc_printer(kc_t("_l );\
\n#ifndef KC_ASSERT_NO_ABORT\
\n    abort();\
\n#else\
\n    exit( 1 );\
\n#endif\
\n#endif\
\n}\
\n\
\nvoid\
\nkc_assertionReasonFailed(const char *kc_fn, int kc_l, const char *kc_s)\
\n{\
\n  "), kc_current_view );
		  kc_printer(kc_t("  fflush(stdout);\
\n#ifdef _AFX\
\n	USES_CONVERSION;\
\n	const _TCHAR* format=_T(\"Internal Error: Assertion failed at file %s:%d: %s\\n\");\
\n	const _TCHAR* tkc_func=A2CT(kc_fn);\
\n	const _TCHAR* t"), kc_current_view );
		  kc_printer(kc_t("kc_s=A2CT(kc_s);\
\n	TRACE( format, tkc_func, kc_l, tkc_s );\
\n#ifdef _DEBUG\
\n    if (AfxAssertFailedLine(kc_fn, kc_l))\
\n#endif\
\n	AfxDebugBreak();\
\n#else\
\n    fprintf( stderr, \"Internal Err"), kc_current_view );
		  kc_printer(kc_t("or: Assertion failed at file %s:%d: %s\\n\", kc_fn, kc_l, kc_s );\
\n#ifndef KC_ASSERT_NO_ABORT\
\n    abort();\
\n#else\
\n    exit( 1 );\
\n#endif\
\n#endif\
\n}\
\n\
\nvoid\
\nkc_assertionNonNullFai"), kc_current_view );
		  kc_printer(kc_t("led(const char *kc_fn, int kc_l, const char *kc_str)\
\n{\
\n    fflush(stdout);\
\n#ifdef _AFX\
\n	USES_CONVERSION;\
\n	const _TCHAR* format=_T(\"Internal Error: Assertion failed at %s:%d: pointer %s "), kc_current_view );
		  kc_printer(kc_t("is NULL\\n\");\
\n	const _TCHAR* tkc_func=A2CT(kc_fn);\
\n	const _TCHAR* tkc_s=A2CT(kc_str);\
\n	TRACE( format , tkc_func, kc_l, tkc_s);\
\n#ifdef _DEBUG\
\n    if (AfxAssertFailedLine(kc_fn, kc_l))\
\n"), kc_current_view );
		  kc_printer(kc_t("#endif\
\n	AfxDebugBreak();\
\n#else\
\n    fprintf( stderr, \"Internal Error: Assertion failed at %s:%d: pointer %s is NULL\\n\", kc_fn, kc_l, kc_str );\
\n#ifndef KC_ASSERT_NO_ABORT\
\n    abort();\
\n"), kc_current_view );
		  kc_printer(kc_t("#else\
\n    exit( 1 );\
\n#endif\
\n#endif\
\n}\
\n\
\nvoid\
\nkc_assertionOperatorInPhylumFailed(int kc_op, const char *kc_str1, const char *kc_str2, const char *kc_phy, const char *kc_fn, int kc_l)\
\n"), kc_current_view );
		  kc_printer(kc_t("{\
\n    fflush(stdout);\
\n#ifdef _AFX\
\n    USES_CONVERSION;\
\n    const _TCHAR* format=_T(\"Internal Error: Assertion failed at %s:%d: illegal value for (%s) %s%s: %d not a valid operator\\n\");\
\n"), kc_current_view );
		  kc_printer(kc_t("    const _TCHAR* tkc_func=A2CT(kc_fn);\
\n    const _TCHAR* tkc_s1=A2CT(kc_str1);\
\n    const _TCHAR* tkc_s2=A2CT(kc_str2);\
\n    const _TCHAR* tname=A2CT(kc_phy);\
\n    if ((kc_op <= one_before_fi"), kc_current_view );
		  kc_printer(kc_t("rst_operator) || (kc_op >= last_operator)) {\
\n	TRACE (format, tkc_func, kc_l, tname, tkc_s1, tkc_s2, kc_op );\
\n    } else {\
\n	format=_T(\"Internal Error: Assertion failed at %s:%d: illegal value "), kc_current_view );
		  kc_printer(kc_t("for (%s) %s%s: %s (%d) is a value of %s\\n\");\
\n	const _TCHAR* tname2=A2CT(operator_info[kc_op].name);\
\n	const _TCHAR* tname3=A2CT(phylum_info[operator_info[kc_op].phylum].name);\
\n	TRACE(format,t"), kc_current_view );
		  kc_printer(kc_t("kc_func, kc_l, tname, tkc_s1, tkc_s2, tname2, kc_op, tname3 );\
\n    }\
\n#ifdef _DEBUG\
\n	if (AfxAssertFailedLine(kc_fn, kc_l))\
\n#endif\
\n		AfxDebugBreak();\
\n#else\
\n    if ((kc_op <= one_befo"), kc_current_view );
		  kc_printer(kc_t("re_first_operator) || (kc_op >= last_operator)) {\
\n	fprintf( stderr, \"Internal Error: Assertion failed at %s:%d: illegal value for (%s) %s%s: %d not a valid operator\\n\",\
\n		kc_fn, kc_l, kc_phy, "), kc_current_view );
		  kc_printer(kc_t("kc_str1, kc_str2, kc_op );\
\n    } else {\
\n	fprintf( stderr, \"Internal Error: Assertion failed at %s:%d: illegal value for (%s) %s%s: %s (%d) is a value of %s\\n\",\
\n		kc_fn, kc_l, kc_phy, kc_str"), kc_current_view );
		  kc_printer(kc_t("1, kc_str2, operator_info[kc_op].name, kc_op, phylum_info[operator_info[kc_op].phylum].name );\
\n    }\
\n#ifndef KC_ASSERT_NO_ABORT\
\n    abort();\
\n#else\
\n    exit( 1 );\
\n#endif\
\n#endif\
\n}"), kc_current_view );
		  kc_printer(kc_t("\
\n\
\nvoid kc_invalid_operator( const char *kc_func_prefix, enum_phyla kc_phy, int kc_line, const char *kc_file, enum_operators kc_oper )\
\n{\
\n    fflush(stdout);\
\n#ifdef _AFX\
\n    USES_CONVER"), kc_current_view );
		  kc_printer(kc_t("SION;\
\n    const _TCHAR* format=_T(\"Internal Error: invalid operator code in %s%s at %s:%d: %s\\n\");\
\n    const _TCHAR* tkc_func=A2CT(kc_func_prefix);\
\n    const _TCHAR* tkc_file=A2CT(kc_file);"), kc_current_view );
		  kc_printer(kc_t("\
\n    const _TCHAR* ts1=A2CT(phylumname_or_error( kc_phy ));\
\n    const _TCHAR* ts2=A2CT(kc_operatorname_or_error( kc_oper ));\
\n    TRACE( format, tkc_func, ts1, tkc_file, kc_line, ts2);\
\n#ifde"), kc_current_view );
		  kc_printer(kc_t("f _DEBUG\
\n    if (AfxAssertFailedLine(kc_file, kc_line))\
\n#endif\
\n	AfxDebugBreak();\
\n#else\
\n    fprintf( stderr, \"Internal Error: invalid operator code in %s%s at %s:%d: %s\\n\", kc_func_pre"), kc_current_view );
		  kc_printer(kc_t("fix, phylumname_or_error( kc_phy ), kc_file, kc_line, kc_operatorname_or_error( kc_oper ));\
\n#ifndef KC_INVALID_OPERATOR_NO_ABORT\
\n    abort();\
\n#else\
\n    exit( 1 );\
\n#endif\
\n#endif\
\n}\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_assertmacros_h_enum: {
	    view_gen_assertmacros_h_class& kc_current_view=static_cast<view_gen_assertmacros_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\n#ifndef KC_NO_DEFAULT_IN_WITH\
\n# define KC_NO_DEFAULT_IN_WITH \"Internal Error: no default action defined in function %s at %s:%d\\n\"\
\n#endif\
\nvoid kc_no_default_in_with (const char*, int, "), kc_current_view );
		  kc_printer(kc_t("const char*);\
\nvoid kc_returnless_function (const char *, int, const char*);\
\n\
\n#ifndef NDEBUG\
\n# define assertCond(t) do {if (!(t)) kc_assertionFailed(__FILE__,__LINE__);}while(false)\
\n# def"), kc_current_view );
		  kc_printer(kc_t("ine assertReason(t,s) do {if (!(t)) kc_assertionReasonFailed(__FILE__,__LINE__,s);}while(false)\
\n# define assertNonNull(p) do {if (p == 0) kc_assertionNonNullFailed(__FILE__,__LINE__,#p);}while(false"), kc_current_view );
		  kc_printer(kc_t(")\
\n# define assertPhylum(ptr,phy) do { \\\
\n    assertNonNull(ptr); \\\
\n    if (ptr->phylum()!=phy) \\\
\n	kc_assertionOperatorInPhylumFailed(ptr->prod_sel(),#ptr,\"->prod_sel()\",\"phy\",__FILE__"), kc_current_view );
		  kc_printer(kc_t(",__LINE__); \\\
\n    } while(false)\
\n#else\
\n# define assertCond(t)\
\n# define assertReason(t,s)\
\n# define assertNonNull(ptr)\
\n# define assertPhylum(op,phy)\
\n#endif\
\n#define assertionFaile"), kc_current_view );
		  kc_printer(kc_t("d(s) kc_assertionReasonFailed(__FILE__,__LINE__,s)\
\n\r\
\nvoid kc_assertionFailed (const char*, int) __attribute__ ((noreturn));\
\nvoid kc_assertionReasonFailed (const char*, int, const char*) __att"), kc_current_view );
		  kc_printer(kc_t("ribute__ ((noreturn));\
\nvoid kc_assertionNonNullFailed (const char*, int, const char*) __attribute__ ((noreturn));\
\nvoid kc_assertionOperatorInPhylumFailed (int, const char*, const char*, const cha"), kc_current_view );
		  kc_printer(kc_t("r*, const char*, int) __attribute__ ((noreturn));\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_noofoperators_h_enum: {
	    view_gen_noofoperators_h_class& kc_current_view=static_cast<view_gen_noofoperators_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("#define KC_NO_OF_OPERATORS "), kc_current_view); }
		kc::unparse(g_no_of_operators, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_yaccstacktype_h_enum: {
	    view_gen_yaccstacktype_h_class& kc_current_view=static_cast<view_gen_yaccstacktype_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("#ifndef YYSTYPE_HEADER\
\n#define YYSTYPE_HEADER\
\nunion KC_YYSTYPE {\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("};\
\n#define YYSTYPE KC_YYSTYPE\
\n#endif // YYSTYPE_HEADER\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_nodetypes_h_enum: {
	    view_gen_nodetypes_h_class& kc_current_view=static_cast<view_gen_nodetypes_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
	    }
	    break;
	}
	case view_gen_nodetypedefs_h_enum: {
	    view_gen_nodetypedefs_h_class& kc_current_view=static_cast<view_gen_nodetypedefs_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		if(!g_options.no_printdot) 
		{
		    { kc_printer(kc_t("typedef class impl_kc_dotedgenode_t *kc_dotedgenode_t;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatormap_c_enum: {
	    view_gen_operatormap_c_class& kc_current_view=static_cast<view_gen_operatormap_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		kc::unparse(d, kc_printer, view_gen_operatormap_subphyla);
		kc::unparse(d, kc_printer, view_gen_operatormap_attributes);
		{ kc_printer(kc_t("\
\n\
\nKC_OPERATOR_INFO operator_info[] = {\
\n"), kc_current_view); }
		{
		    int i = OPERATORNUMBEROFFSET; do 
		    {
			{ kc_printer(kc_t("    { \"\", 0, 0, one_before_first_phylum, 0, 0, 0, 0 }, /* dummy element */\
\n"), kc_current_view); }
			i--; 
			 }
		    while (i >= 0); 
		     }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    { \"\", 0, 0, one_before_first_phylum, 0, 0, 0, 0 } /* last element */\
\n};\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("KC_PHYLUM_INFO phylum_info[] = {\
\n"), kc_current_view); }
		{
		    int i = PHYLUMNUMBEROFFSET; do 
		    {

			{ kc_printer(kc_t("    { \"\", one_before_first_operator, one_before_first_operator, (kc_storageclass_t)0 }, /* dummy element */\
\n"), kc_current_view); }
			i--; 
			 }
		    while (i >= 0); 
		     }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    { \"\", one_before_first_operator, one_before_first_operator, (kc_storageclass_t)0 } /* last element */\
\n};\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatormap_type_h_enum: {
	    view_gen_operatormap_type_h_class& kc_current_view=static_cast<view_gen_operatormap_type_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_enumoperators_h_enum: {
	    view_gen_enumoperators_h_class& kc_current_view=static_cast<view_gen_enumoperators_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		g_no_of_operators = OPERATORNUMBEROFFSET; 
			{ kc_printer(kc_t("typedef enum { one_before_first_operator = "), kc_current_view); }
		kc::unparse(g_no_of_operators, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" ,\
\n"), kc_current_view); }
		g_no_of_operators++; 
		kc::unparse(pds, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    last_operator = "), kc_current_view); }
		kc::unparse(g_no_of_operators, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n} enum_operators;\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_enumphyla_h_enum: {
	    view_gen_enumphyla_h_class& kc_current_view=static_cast<view_gen_enumphyla_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations pds = this->phylumdeclarations_1;
		g_no_of_phyla = PHYLUMNUMBEROFFSET; 
			{ kc_printer(kc_t("typedef enum { one_before_first_phylum = "), kc_current_view); }
		kc::unparse(g_no_of_phyla, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" ,\
\n"), kc_current_view); }
		g_no_of_phyla++; 
		kc::unparse(pds, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    last_phylum = "), kc_current_view); }
		kc::unparse(g_no_of_phyla, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n} enum_phyla;\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_alloc_c_enum: {
	    view_gen_alloc_c_class& kc_current_view=static_cast<view_gen_alloc_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\n#ifdef KC_STATISTICS\
\nKC_OPERATOR_STATISTICS operator_statistics[KC_NO_OF_OPERATORS];\
\nstatic int kc_casestring_strlen =0;\
\nstatic int kc_nocasestring_strlen =0;\
\n#  define KC_COLLECT_STATS"), kc_current_view );
		  kc_printer(kc_t("0(v) v\
\n#else\
\n#  define KC_COLLECT_STATS0(v)\
\n#endif\
\n\
\n#ifndef KC_CREATE_STATS\
\n#  define KC_CREATE_STATS(oper) operator_statistics[oper].created++;\
\n#endif\
\n#ifndef KC_EXISTINGNOTFOU"), kc_current_view );
		  kc_printer(kc_t("ND_STATS\
\n#  define KC_EXISTINGNOTFOUND_STATS(oper) operator_statistics[oper].existing_not_found++;\
\n#endif\
\n\
\n#ifndef KC_FREE_CALLED_STATS\
\n#  define KC_FREE_CALLED_STATS(oper,rec) operator_"), kc_current_view );
		  kc_printer(kc_t("statistics[oper].free_called[(rec?true:false)]++;\
\n#endif\
\n\
\n#ifndef KC_FREED_STATS\
\n#  define KC_FREED_STATS(oper,rec) operator_statistics[oper].freed[(rec?true:false)]++;\
\n#endif\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_alloc_h_enum: {
	    view_gen_alloc_h_class& kc_current_view=static_cast<view_gen_alloc_h_class&>(kc_current_view_base);
	    {
		const phylumdeclarations d = this->phylumdeclarations_1;
		{ kc_printer(kc_t("\
\nextern bool kc_storageclass_still_uniq[];\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_k_c_enum: {
	    view_gen_k_c_class& kc_current_view=static_cast<view_gen_k_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#define KC_TYPES\
\n"), kc_current_view); }
		if(g_options.stdafx!="") {
		    PRINT("#include \"");
		    PRINT(g_options.stdafx.c_str());
		    PRINT("\"\n");
		}	
			{ kc_printer(kc_t("\
\n#include \""), kc_current_view); }
		PRINT(g_options.prefix.c_str()); 
			{ kc_printer(kc_t("k.h\"\
\n#include <stdio.h>\
\n#include <ctype.h>\
\n#include <string>\
\n#include <sys/types.h>\
\n#include <stdlib.h>\
\n\
\n#ifdef _MSC_VER\
\n#pragma warning( disable : 4786 )\
\n#endif\
\n#include"), kc_current_view );
		  kc_printer(kc_t(" <new>\
\n#include <set>\
\n#include <list>\
\n#include <algorithm>\
\n\
\n#if !defined(USE_HASHSET) && (defined(__GNUC__) || defined(__ICC) || defined(__ECC)) \\\
\n	&& !defined(DONT_USE_HASHSET)\
\n#"), kc_current_view );
		  kc_printer(kc_t("  define USE_HASHSET\
\n#endif\
\n#ifdef USE_HASHSET\
\n#  if defined(__GNUC__) && __GNUC__>2\
\n#    include <ext/hash_set>\
\n#  else\
\n#    include <hash_set>\
\n#  endif\
\n#endif\
\n\
\nusing nam"), kc_current_view );
		  kc_printer(kc_t("espace std;\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_open_namespace);
		{ kc_printer(kc_t("\
\ninline bool\
\nht_less(casestring p1, casestring p2){\
\n    return kc_strcmp(p1->name, p2->name)<0;\
\n}\
\n\
\ninline bool\
\nht_less(nocasestring p1, nocasestring p2){\
\n    return kc_strcasecm"), kc_current_view );
		  kc_printer(kc_t("p(p1->name, p2->name)<0;\
\n}\
\n\
\ninline bool\
\nht_less(real p1, real p2){\
\n    return p1->value < p2->value;\
\n}\
\n\
\ninline bool\
\nht_less(integer p1, integer p2){\
\n    return p1->value <"), kc_current_view );
		  kc_printer(kc_t(" p2->value;\
\n}\
\n\
\ninline bool\
\nht_less(voidptr p1, voidptr p2){\
\n    return p1->pointer < p2->pointer;\
\n}\
\n\
\nbool\
\nht_less(abstract_phylum p1, abstract_phylum p2)\
\n{\
\n    enum_ope"), kc_current_view );
		  kc_printer(kc_t("rators prod_sel=p1->prod_sel();\
\n    enum_operators prod_sel2=p2->prod_sel();\
\n    if(prod_sel<prod_sel2)\
\n	return true;\
\n    if(prod_sel>prod_sel2)\
\n	return false;\
\n    switch(prod_sel) {\
\n"), kc_current_view );
		  kc_printer(kc_t("	case sel_NoCaseStr:\
\n	    \vreturn ht_less(static_cast<nocasestring>(p1),static_cast<nocasestring>(p2));\r\
\n	case sel__Str:\
\n	    \vreturn ht_less(static_cast<casestring>(p1),static_cast<casestr"), kc_current_view );
		  kc_printer(kc_t("ing>(p2));\r\
\n	case sel__Real:\
\n	    \vreturn ht_less(static_cast<real>(p1),static_cast<real>(p2));\r\
\n	case sel__Int:\
\n	    \vreturn ht_less(static_cast<integer>(p1),static_cast<integer>(p2));"), kc_current_view );
		  kc_printer(kc_t("\r\
\n	case sel__VoidPtr:\
\n	    \vreturn ht_less(static_cast<voidptr>(p1),static_cast<voidptr>(p2));\r\
\n	default: {\
\n	    int i=0;\
\n	    bool still_unique = kc_storageclass_still_uniq[phylum_in"), kc_current_view );
		  kc_printer(kc_t("fo[p1->phylum()].uniq_stored];\
\n	    abstract_phylum sub1=0;\
\n	    do {\
\n		sub1=p1->subphylum(i);\
\n		abstract_phylum sub2=p2->subphylum(i);\
\n		if(still_unique) {\
\n		    if(sub1<sub2)\
\n			"), kc_current_view );
		  kc_printer(kc_t("return true;\
\n		    if(sub2<sub1)\
\n			return false;\
\n		}\
\n		else {\
\n		    if(ht_less(sub1, sub2))\
\n			return true;\
\n		    if(ht_less(sub2, sub1))\
\n			return false;\
\n		}\
\n		++i;\
\n	"), kc_current_view );
		  kc_printer(kc_t("    } while(sub1);\
\n	}\
\n    }\
\n    return false;\
\n}\
\n\
\ntemplate<typename T>\
\nclass phylum_less : std::binary_function<T, T, bool>\
\n{\
\npublic:\
\n    bool operator()(const T& X, const "), kc_current_view );
		  kc_printer(kc_t("T& Y) const\
\n	\v{ return ht_less(X,Y); }\r\
\n};\
\n\
\ninline void deletefun(c_abstract_phylum t){\
\n    delete const_cast<abstract_phylum>(t);\
\n}\
\n\
\n"), kc_current_view); }
		string how_smart = "";
		if(g_options.smart_pointer) how_smart="_ptr"; 
			{ kc_printer(kc_t("\
\n#ifdef USE_HASHSET\
\nstruct hashitem {\
\n    size_t hashvalue;\
\n    casestring"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" contents;\
\n    hashitem(casestring"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" cs): contents(cs) {\
\n	unsigned long h = 0;\
\n	kc_char_t const *s = cs->name;\
\n	for ( ; *s; ++s)\
\n	    \vh = 5*h + *s;\r\
\n	hashvalue=(size_t)h;\
\n    }\
\n};\
\n\
\ninline void deletefunhashi"), kc_current_view );
		  kc_printer(kc_t("tem(hashitem t) {\
\n    delete t.contents;\
\n}\
\n\
\n#  ifdef __GNUC__\
\nstruct eq_hashitem { bool operator()(hashitem hi1, hashitem hi2) const {\
\n    return kc_strcmp(hi1.contents->name, hi2.con"), kc_current_view );
		  kc_printer(kc_t("tents->name) == 0; } };\
\n\
\nstruct hash_hashitem { size_t operator()(hashitem hi) const {\
\n    return hi.hashvalue; } };\
\n\
\n#  else\
\nstruct comp_hashitem {\
\n    enum { bucket_size = 4, min"), kc_current_view );
		  kc_printer(kc_t("_buckets = 8 };\
\n    // bucket_size and min_buckets are just guesses\
\n    size_t operator()(const hashitem hi) const {\
\n	return hi.hashvalue; }\
\n    bool operator()(const hashitem hi1, const ha"), kc_current_view );
		  kc_printer(kc_t("shitem hi2) const {\
\n	return kc_strcmp(hi1.contents->name, hi2.contents->name) < 0; }\
\n};\
\n#  endif // Whether gcc or icc\
\n#endif // Whether hash or not\
\n\
\nstruct hashtable_level\
\n{\
\n	h"), kc_current_view );
		  kc_printer(kc_t("ashtable_level(bool cod = true): clean_on_destruction(cod) { }\
\n"), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	void clear(bool free_entries=true) {\
\n	    if(free_entries)\
\n		clear_entries();\
\n	    _casestring.clear();\
\n	    _nocasestring.clear();\
\n	    _integer.clear();\
\n	    _real.clear();\
\n	   "), kc_current_view );
		  kc_printer(kc_t(" _voidptr.clear();\
\n	    _abstract_phylum.clear();\
\n	}\
\n	void clear_entries() {\
\n#ifdef USE_HASHSET\
\n		std::for_each(_casestring.begin(),_casestring.end(),deletefunhashitem);\
\n#else\
\n		st"), kc_current_view );
		  kc_printer(kc_t("d::for_each(_casestring.begin(),_casestring.end(),deletefun);\
\n#endif\
\n		std::for_each(_nocasestring.begin(),_nocasestring.end(),deletefun);\
\n		std::for_each(_integer.begin(),_integer.end(),delet"), kc_current_view );
		  kc_printer(kc_t("efun);\
\n		std::for_each(_real.begin(),_real.end(),deletefun);\
\n		std::for_each(_voidptr.begin(),_voidptr.end(),deletefun);\
\n		std::for_each(_abstract_phylum.begin(),_abstract_phylum.end(),deletef"), kc_current_view );
		  kc_printer(kc_t("un);\
\n	    }\
\n	~hashtable_level() {\
\n	    clear(clean_on_destruction);\
\n	}\
\n	abstract_phylum check_insert(abstract_phylum t) {\
\n	    return *_abstract_phylum.insert(t).first;\
\n	}\
\n	case"), kc_current_view );
		  kc_printer(kc_t("string check_insert(casestring t) {\
\n#ifdef USE_HASHSET\
\n	    return (*_casestring.insert(hashitem(t)).first).contents;\
\n#else\
\n	    return *_casestring.insert(t).first;\
\n#endif\
\n	}\
\n	noc"), kc_current_view );
		  kc_printer(kc_t("asestring check_insert(nocasestring t) {\
\n	    return *_nocasestring.insert(t).first;\
\n	}\
\n	integer check_insert(integer t) {\
\n	    return *_integer.insert(t).first;\
\n	}\
\n	real check_insert"), kc_current_view );
		  kc_printer(kc_t("(real t) {\
\n	    return *_real.insert(t).first;\
\n	}\
\n	voidptr check_insert(voidptr t) {\
\n	    return *_voidptr.insert(t).first;\
\n	}\
\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("	void clear() {\
\n	    _casestring.clear();\
\n	    _nocasestring.clear();\
\n	    _integer.clear();\
\n	    _real.clear();\
\n	    _voidptr.clear();\
\n	    _abstract_phylum.clear();\
\n	}\
\n	abstra"), kc_current_view );
		  kc_printer(kc_t("ct_phylum check_insert(abstract_phylum t) {\
\n	    return *_abstract_phylum.insert(abstract_phylum_ptr(t)).first;\
\n	}\
\n	casestring check_insert(casestring t) {\
\n	    return *_casestring.insert(c"), kc_current_view );
		  kc_printer(kc_t("asestring_ptr(t)).first;\
\n	}\
\n	nocasestring check_insert(nocasestring t) {\
\n	    return *_nocasestring.insert(nocasestring_ptr(t)).first;\
\n	}\
\n	integer check_insert(integer t) {\
\n	    retur"), kc_current_view );
		  kc_printer(kc_t("n *_integer.insert(integer_ptr(t)).first;\
\n	}\
\n	real check_insert(real t) {\
\n	    return *_real.insert(real_ptr(t)).first;\
\n	}\
\n	voidptr check_insert(voidptr t) {\
\n	    return *_voidptr.ins"), kc_current_view );
		  kc_printer(kc_t("ert(voidptr_ptr(t)).first;\
\n	}\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\rprivate:\v\
\n	bool clean_on_destruction;\
\n#ifdef USE_HASHSET\
\n#  ifdef __GNUC__\
\n#    if __GNUC__==2 || (__GNUC__==3 && __GNUC_MINOR__==0)\
\n	std::hash_set<hashitem, hash_hashitem, eq_hashite"), kc_current_view );
		  kc_printer(kc_t("m> _casestring;\
\n#    else\
\n	__gnu_cxx::hash_set<hashitem, hash_hashitem, eq_hashitem> _casestring;\
\n#    endif\
\n#  else\
\n	std::hash_set<hashitem, comp_hashitem> _casestring;\
\n#  endif\
\n#"), kc_current_view );
		  kc_printer(kc_t("else\
\n	std::set<casestring"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", phylum_less<casestring"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t("> > _casestring;\
\n#endif\
\n	std::set<nocasestring"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", phylum_less<nocasestring"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t("> > _nocasestring;\
\n	std::set<integer"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", phylum_less<integer"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t("> > _integer;\
\n	std::set<real"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", phylum_less<real"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t("> > _real;\
\n	std::set<voidptr"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", phylum_less<voidptr"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t("> > _voidptr;\
\n	std::set<abstract_phylum"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", phylum_less<abstract_phylum"), kc_current_view); }
		kc::unparse(how_smart, kc_printer, kc_current_view);
		{ kc_printer(kc_t("> > _abstract_phylum;\
\n};\
\n\
\nclass hashtable_stack: public std::list<hashtable_level> {\
\n\rpublic:\v\
\n    hashtable_stack(): _pos(begin()) { }\
\n\
\n    void inc_level() { _pos=insert(_pos, "), kc_current_view );
		  kc_printer(kc_t("hashtable_level()); }\
\n    void dec_level() { if(valid() && _pos!=end()) ++_pos; }\
\n    void free_level() { if(_pos!=begin()) { erase(begin(),_pos);_pos=begin(); } }\
\n\
\n    bool valid() const {"), kc_current_view );
		  kc_printer(kc_t(" return !empty(); }\
\n    hashtable_level& get_level() { return *_pos; }\
\n\
\n    template<typename T>\
\n    T check_insert(T t) {\
\n	return dynamic_cast<T>((*_pos).check_insert(t));\
\n    }\
\n\r"), kc_current_view );
		  kc_printer(kc_t("private:\v\
\n    iterator _pos;\
\n};\
\n\
\nclass hashtable_struct_t {\
\n\rpublic:\v\
\n    // don't clean _static_level on destruction (program ends)\
\n    hashtable_struct_t(): _static_level(fals"), kc_current_view );
		  kc_printer(kc_t("e), _to_be_freed(false),  _dynamic(false) { }\
\n\
\n    template <typename T>\
\n    T ht_check_insert(T t) {\
\n	if(_dynamic && _dynamic_level.valid())\
\n	    return _dynamic_level.check_insert(t);\
\n"), kc_current_view );
		  kc_printer(kc_t("	else\
\n	    return dynamic_cast<T>(_static_level.check_insert(t));\
\n    }\
\n    void ht_static() {_dynamic=false; }\
\n    void ht_dynamic() {\
\n	_dynamic=true;\
\n	if(!_dynamic_level.valid())\
\n"), kc_current_view );
		  kc_printer(kc_t("	    _dynamic_level.inc_level();\
\n    }\
\n    void ht_inc_level() { _dynamic_level.inc_level(); }\
\n    void ht_dec_level() { _dynamic_level.dec_level(); }\
\n    void ht_free_level() { _dynamic_le"), kc_current_view );
		  kc_printer(kc_t("vel.free_level(); }\
\n    void ht_clear() { _static_level.clear(); _dynamic_level.clear(); _dynamic=false; }\
\n\
\n    bool to_be_freed() { return _to_be_freed; }\
\n    void set_to_be_freed(bool b=t"), kc_current_view );
		  kc_printer(kc_t("rue) { _to_be_freed=b; }\
\n\rprivate:\v\
\n    hashtable_level _static_level;\
\n    hashtable_stack _dynamic_level;\
\n    bool _to_be_freed; /* should be true for dynamic, false for statically alloc"), kc_current_view );
		  kc_printer(kc_t("ated structures */\
\n    bool _dynamic;\
\n};\
\n\
\nimpl_nocasestring_NoCaseStr::impl_nocasestring_NoCaseStr(const kc_char_t* _name) : name(_name) { }\
\nvoid impl_nocasestring_NoCaseStr::make_own(in"), kc_current_view );
		  kc_printer(kc_t("t length) {\
\n    kc_char_t *newname=new kc_char_t[length+1];\
\n    for (int i=0; i < length && name[i]; ++i)\
\n	newname[i] = kc_tolower(name[i]);\
\n    newname[length]=0;\
\n    name=newname;\
\n}"), kc_current_view );
		  kc_printer(kc_t("\
\n\
\nimpl_casestring__Str::impl_casestring__Str(const kc_char_t* _name) : name(_name) { }\
\nvoid impl_casestring__Str::make_own(int length) {\
\n    kc_char_t *newname=kc_strncpy(new kc_char_t[leng"), kc_current_view );
		  kc_printer(kc_t("th+1],name,length);\
\n    newname[length]=0;\
\n    name=newname;\
\n}\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_end_k_h_enum: {
	    view_gen_end_k_h_class& kc_current_view=static_cast<view_gen_end_k_h_class&>(kc_current_view_base);
	    {
		kc::unparse(this, kc_printer, view_close_namespace);
		{ kc_printer(kc_t("#endif // KC_TYPES_HEADER\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_k_h_enum: {
	    view_gen_k_h_class& kc_current_view=static_cast<view_gen_k_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("/* translation of file(s)\n"), kc_current_view); }
		kc::unparse(Thefnfiles, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" */\
\n/* generated by:\
\n *  "), kc_current_view); }
		kc::unparse(kimwitu_copyright, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n */\
\n#ifndef KC_TYPES_HEADER\
\n#define KC_TYPES_HEADER\
\n\
\n#define KIMWITUVERSIONMAJOR "), kc_current_view); }
		kc::unparse(METAKIMWITUVERSIONMAJOR, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n#define KIMWITUVERSIONMINOR "), kc_current_view); }
		kc::unparse(METAKIMWITUVERSIONMINOR, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n#define KIMWITUVERSIONMICRO "), kc_current_view); }
		kc::unparse(METAKIMWITUVERSIONMICRO, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n\
\n#include <stdio.h>\
\n#include <stddef.h>\
\n#include <string>\
\n\
\nnamespace kc {\r\
\n\
\n#ifndef INTEGER\
\n# define INTEGER int\
\n#endif\
\n#ifndef REAL\
\n# define REAL double\
\n#endif"), kc_current_view );
		  kc_printer(kc_t("\
\n\
\n#ifdef KC_UNICODE\
\n\
\n#define kc_t(TEXT) L ## TEXT\
\ntypedef wchar_t kc_char_t;\
\ntypedef std::wstring kc_string_t;\
\n\
\n#if defined(_WIN32) && ! defined (__GNUC__)\
\n#define kc_strlen "), kc_current_view );
		  kc_printer(kc_t("wcslen\
\n#define kc_strcmp wcscmp\
\n#define kc_strcasecmp _wcsicmp\
\n#define kc_strcpy wcscpy\
\n#define kc_strncpy wcsncpy\
\n#define kc_tolower towlower\
\n#define kc_print_integer(buf,number) swp"), kc_current_view );
		  kc_printer(kc_t("rintf(buf,kc_t(\"%d\"),number)\
\n#define kc_print_real(buf,number) swprintf(buf,kc_t(\"%g\"),number)\
\n\
\n// needed for printdot and csgio only\
\ninline\
\nstd::string kc_to_cstring(const std::wstr"), kc_current_view );
		  kc_printer(kc_t("ing& s) {\
\n    USES_CONVERSION;\
\n    return W2CA(s.c_str());\
\n}\
\n\
\n// needed for csgio only\
\ninline\
\nstd::wstring kc_to_wstring(const std::string& s) {\
\n    USES_CONVERSION;\
\n    retu"), kc_current_view );
		  kc_printer(kc_t("rn A2CW(s.c_str());\
\n}\
\n\
\n#else // !defined(_WIN32) || defined(__GNUC__)\
\n// if you want to use UNICODE on other platforms you have to write\
\n// the following functions on your own\
\nint kc_"), kc_current_view );
		  kc_printer(kc_t("strlen(const kc_char_t*);\
\nint kc_strcmp(const kc_char_t*,const kc_char_t*);\
\nint kc_strcasecmp(const kc_char_t*,const kc_char_t*);\
\nint kc_strcpy(kc_char_t*,const kc_char_t*);\
\nint kc_strncpy("), kc_current_view );
		  kc_printer(kc_t("kc_char_t*,const kc_char_t*, int);\
\nkc_char_t kc_tolower(kc_char_t);\
\nint kc_print_integer(kc_char_t* buffer, INTEGER number );\
\nint kc_print_real(kc_char_t* buffer, REAL number);\
\n\
\n// neede"), kc_current_view );
		  kc_printer(kc_t("d for printdot and csgio only\
\nstd::string kc_to_cstring(const std::wstring& );\
\n// needed for csgio only\
\nstd::wstring kc_to_wstring(const std::string& );\
\n\
\n#endif\
\n\
\n#else // !KC_UNICO"), kc_current_view );
		  kc_printer(kc_t("DE\
\n  \
\n#define kc_t(TEXT) TEXT  \
\ntypedef char kc_char_t;\
\ntypedef std::string kc_string_t;\
\n\
\n#define kc_strlen strlen\
\n#define kc_strcmp strcmp\
\n#if defined(_WIN32) && ! defined (__G"), kc_current_view );
		  kc_printer(kc_t("NUC__)\
\n#define kc_strcasecmp _stricmp\
\n#else\
\n#define kc_strcasecmp strcasecmp\
\n#endif\
\n#define kc_strcpy strcpy\
\n#define kc_strncpy strncpy\
\n#define kc_tolower tolower  \
\n#define kc_p"), kc_current_view );
		  kc_printer(kc_t("rint_integer(buf,number) sprintf(buf,kc_t(\"%d\"),number)\
\n#define kc_print_real(buf,number) sprintf(buf,kc_t(\"%g\"),number)\
\n#endif\
\n"), kc_current_view); }
		if(!g_options.no_unparse) 
		{
		    { kc_printer(kc_t("class uview_class;\
\ntypedef uview_class& uview;\
\ntypedef const uview_class& c_uview;\
\n\
\ntypedef class printer_functor_class& printer_functor;\
\ntypedef void (*printer_function)(const kc_char_t"), kc_current_view );
		  kc_printer(kc_t("*, uview);\
\n"), kc_current_view); }
		}
		if(!g_options.no_rewrite) 
		{
		    { kc_printer(kc_t("\
\nclass rview_class;\
\ntypedef rview_class& rview;\
\ntypedef const rview_class& c_rview;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\
\n\v}\
\n\
\n// Some compilers know __attribute__. Right now we test for the GNU compiler\
\n// and Intel's icc (for ia32) and ecc (for ia64).\
\n#if !defined __GNUC__ && !defined __ICC && !defined _"), kc_current_view );
		  kc_printer(kc_t("_ECC\
\n# define __attribute__(x)\
\n#endif\
\n\
\n// Since all definitions are in namespace kc now, there is no need\
\n// give them a kc_ prefix. Old code may still rely on the prefix, so these\
\n//"), kc_current_view );
		  kc_printer(kc_t(" macros are generated for backwards compatibility\
\n#ifdef KC_DEPRECATED\
\n#define kc_PhylumInfo           phylum_info\
\n#define kc_OperatorInfo         operator_info\
\n#define kc_last_uview       "), kc_current_view );
		  kc_printer(kc_t("    last_uview\
\n#define kc_uviews               uviews\
\n#define kc_rviews               rviews\
\n#define kc_ht_reuse             ht_clear\
\n#define kc_ht_clear             ht_clear\
\n#define kc_"), kc_current_view );
		  kc_printer(kc_t("ht_assign            ht_assign\
\n#define kc_ht_assigned          ht_assigned\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_deprecated);
		{ kc_printer(kc_t("\
\n#endif // KC_DEPRECATED\
\n\
\n// Some compilers are too stupid to detect that a function will always return\
\n// a proper value when it returns one in all branches of an if- or switch-\
\n// stat"), kc_current_view );
		  kc_printer(kc_t("ement (with final else or default, of course).\
\n#if !defined __GNUC__\
\n# define NORETURN throw 0;\
\n#else\
\n# define NORETURN\
\n#endif\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_open_namespace);
		{ kc_printer(kc_t("\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_close_namespace_enum: {
	    view_close_namespace_class& kc_current_view=static_cast<view_close_namespace_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\n} // namespace kc\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_open_namespace_enum: {
	    view_open_namespace_class& kc_current_view=static_cast<view_open_namespace_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\nnamespace kc {\r\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_no_of_printed_string_chars_reset_enum: {
	    view_no_of_printed_string_chars_reset_class& kc_current_view=static_cast<view_no_of_printed_string_chars_reset_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_printer_reset_enum: {
	    view_printer_reset_class& kc_current_view=static_cast<view_printer_reset_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_printer_outputfileline_enum: {
	    view_printer_outputfileline_class& kc_current_view=static_cast<view_printer_outputfileline_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_phylumdeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_yxx_union_h_enum: {
	    view_gen_yxx_union_h_class& kc_current_view=static_cast<view_gen_yxx_union_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdecls1_h_enum: {
	    view_gen_classdecls1_h_class& kc_current_view=static_cast<view_gen_classdecls1_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_copy_attributes_c_enum: {
	    view_gen_copy_attributes_c_class& kc_current_view=static_cast<view_gen_copy_attributes_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_listdefs_c_enum: {
	    view_gen_listdefs_c_class& kc_current_view=static_cast<view_gen_listdefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_printdotdefs_c_enum: {
	    view_gen_printdotdefs_c_class& kc_current_view=static_cast<view_gen_printdotdefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatordefs_c_enum: {
	    view_gen_operatordefs_c_class& kc_current_view=static_cast<view_gen_operatordefs_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_yaccstacktype_h_enum: {
	    view_gen_yaccstacktype_h_class& kc_current_view=static_cast<view_gen_yaccstacktype_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_nodetypedefs_h_enum: {
	    view_gen_nodetypedefs_h_class& kc_current_view=static_cast<view_gen_nodetypedefs_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatormap_attributes_enum: {
	    view_gen_operatormap_attributes_class& kc_current_view=static_cast<view_gen_operatormap_attributes_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatormap_c_enum: {
	    view_gen_operatormap_c_class& kc_current_view=static_cast<view_gen_operatormap_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_enumoperators_h_enum: {
	    view_gen_enumoperators_h_class& kc_current_view=static_cast<view_gen_enumoperators_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_enumphyla_h_enum: {
	    view_gen_enumphyla_h_class& kc_current_view=static_cast<view_gen_enumphyla_h_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq_enum: {
	    view_check_uniq_class& kc_current_view=static_cast<view_check_uniq_class&>(kc_current_view_base);
	    {
		const phylumdeclaration d = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(d, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations rpds = this->phylumdeclarations_1;
		kc::unparse(rpds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count_enum: {
	    view_check_count_class& kc_current_view=static_cast<view_check_count_class&>(kc_current_view_base);
	    {
		kc::unparse(this, kc_printer, view_check_count1);
		v_freecount(); 
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const phylumdeclaration pd = this->phylumdeclaration_1;
		const phylumdeclarations pds = this->phylumdeclarations_1;
		kc::unparse(pds, kc_printer, kc_current_view);
		kc::unparse(pd, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (phylumdeclarations iterator_ = this; iterator_->phylumdeclarations_1 != 0; iterator_ = iterator_->phylumdeclarations_1)
		    iterator_->phylumdeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_phylumdeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_yxx_union_h_enum: {
	    view_gen_yxx_union_h_class& kc_current_view=static_cast<view_gen_yxx_union_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\nabstract_phylum kc_create(enum_operators createOp"), kc_current_view); }
		int j=Theargsnumbers->last()->value;
		if (j<2) j=2; 
		for (int i = 1; i<=j; ++i) 
		{
		    { kc_printer(kc_t(", abstract_phylum=0"), kc_current_view); }
		}
		{ kc_printer(kc_t(");\
\nabstract_phylum& attributeOf(abstract_phylum kc_p, int no);\
\n\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_classdecls1_h_enum: {
	    view_gen_classdecls1_h_class& kc_current_view=static_cast<view_gen_classdecls1_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_copy_attributes_c_enum: {
	    view_gen_copy_attributes_c_class& kc_current_view=static_cast<view_gen_copy_attributes_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_listdefs_c_enum: {
	    view_gen_listdefs_c_class& kc_current_view=static_cast<view_gen_listdefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_printdotdefs_c_enum: {
	    view_gen_printdotdefs_c_class& kc_current_view=static_cast<view_gen_printdotdefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordefs_c_enum: {
	    view_gen_operatordefs_c_class& kc_current_view=static_cast<view_gen_operatordefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_yaccstacktype_h_enum: {
	    view_gen_yaccstacktype_h_class& kc_current_view=static_cast<view_gen_yaccstacktype_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_nodetypedefs_h_enum: {
	    view_gen_nodetypedefs_h_class& kc_current_view=static_cast<view_gen_nodetypedefs_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_attributes_enum: {
	    view_gen_operatormap_attributes_class& kc_current_view=static_cast<view_gen_operatormap_attributes_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_c_enum: {
	    view_gen_operatormap_c_class& kc_current_view=static_cast<view_gen_operatormap_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_enumoperators_h_enum: {
	    view_gen_enumoperators_h_class& kc_current_view=static_cast<view_gen_enumoperators_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_enumphyla_h_enum: {
	    view_gen_enumphyla_h_class& kc_current_view=static_cast<view_gen_enumphyla_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_uniq_enum: {
	    view_check_uniq_class& kc_current_view=static_cast<view_check_uniq_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		fndeclarations apfd=The_abstract_phylum_decl->additional_members,
		alfd=The_abstract_list_decl->additional_members; 
		kc::unparse(apfd, kc_printer, view_count_attrs);
		if (gl_no_of_args) 
		{
		    { kc_printer(kc_t("void kc_initialize_abstract_phylum(abstract_phylum kc_x)\
\n	    {\n"), kc_current_view); }
		    { kc_printer(kc_t("}\n"), kc_current_view); }
		}
		kc::unparse(alfd, kc_printer, view_count_attrs);
		if (gl_no_of_args) 
		{
		    { kc_printer(kc_t("void kc_initialize_abstract_list(abstract_list kc_x)\
\n	    {\n"), kc_current_view); }
		    { kc_printer(kc_t("}\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_phylumnames::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_uniqmap_c_1_enum: {
	    view_gen_uniqmap_c_1_class& kc_current_view=static_cast<view_gen_uniqmap_c_1_class&>(kc_current_view_base);
	    {
		const ID pn = this->ID_1;
		const phylumnames r_pn = this->phylumnames_1;
		kc::unparse(r_pn, kc_printer, kc_current_view);
		{ kc_printer(kc_t("phylum_"), kc_current_view); }
		kc::unparse(pn, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (phylumnames iterator_ = this; iterator_->phylumnames_1 != 0; iterator_ = iterator_->phylumnames_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_phylumnames::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_uniqmap_c_1_enum: {
	    view_gen_uniqmap_c_1_class& kc_current_view=static_cast<view_gen_uniqmap_c_1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_phylumdeclaration_PhylumDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_set_subphylumdefs_c_enum: {
	    view_gen_set_subphylumdefs_c_class& kc_current_view=static_cast<view_gen_set_subphylumdefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		{ kc_printer(kc_t("void impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::set_subphylum(int no, abstract_phylum val)\
\n{\
\n    abstract_phylum newval=0;\
\n    switch(no) {\
\n	case 0: newval = "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1 = dynamic_cast<"), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(val);break;\
\n	case 1: newval = "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1 = dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(val);break;\
\n    }\
\n    assertNonNull(newval);\
\n}\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const alternatives alt = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_yxx_union_h_enum: {
	    view_gen_yxx_union_h_class& kc_current_view=static_cast<view_gen_yxx_union_h_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("    kc::"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" as_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_subphylumdefs_c_enum: {
	    view_gen_subphylumdefs_c_class& kc_current_view=static_cast<view_gen_subphylumdefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		{ kc_printer(kc_t("abstract_phylum impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::subphylum(int no) const\
\n{\
\n  switch(no){\
\n    case 0: return "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1;\
\n    case 1: return "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1;\
\n  }\
\n  return 0;\
\n}\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const alternatives alt = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		{ kc_printer(kc_t("const enum_phyla "), kc_current_view); }
		kc::unparse(id, kc_printer, view_class_of_phy);
		{ kc_printer(kc_t("::phylum_sel_ = phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\n"), kc_current_view); }
		kc::unparse(id, kc_printer, view_class_of_phy);
		{ kc_printer(kc_t("::"), kc_current_view); }
		kc::unparse(id, kc_printer, view_class_of_phy);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" p1 , "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" p2)\
\n	\v: "), kc_current_view); }
		kc::unparse(additional_members, kc_printer, view_count_nonstaticmembers);
		if (gl_no_of_args) 
		{
		    kc::unparse(gl_members, kc_printer, view_gen_user_assignment_inis);
		    { kc_printer(kc_t(", "), kc_current_view); }
		}
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1(p1), "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1(p2) { }\r\
\n"), kc_current_view); }
	    } else
	    {
		const ID id = this->ID_1;
		const productionblock alts = this->productionblock_1;
		{ kc_printer(kc_t("const enum_phyla "), kc_current_view); }
		kc::unparse(id, kc_printer, view_class_of_phy);
		{ kc_printer(kc_t("::phylum_sel_ = phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\n"), kc_current_view); }
		gl_phylum=id; 
		kc::unparse(alts, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives) && (phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1->prod_sel() == sel_Consalternatives) && ((phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const ID id = this->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1)->alternative_1)->ID_1;
		const Ccode_option cco = this->Ccode_option_1;
		{ kc_printer(kc_t("class impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\ntypedef impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
		kc::unparse(alts, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
	    {
		const phylumdeclaration ph_decl = this/**/;
		const ID id = this->ID_1;
		const productionblock alt = this->productionblock_1;
		const Ccode_option cco = this->Ccode_option_1;
		{ kc_printer(kc_t("class "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);

		{
		    baseclass_list kc_selvar_0_1 = phylum_cast<baseclass_list>(ph_decl->base_classes);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consbaseclass_list)) {

			PRINT("\b :\b ");
			UNPARSE(ph_decl->base_classes);

		    } else
		    {

			{
			    productionblock kc_selvar_1_1 = phylum_cast<productionblock>(alt);
			    if ((kc_selvar_1_1->prod_sel() == sel_ListAlternatives)) {

				PRINT(": public impl_abstract_list"); 
					} else
			    {
				PRINT(": public impl_abstract_phylum"); 
			    }
			}

		    }
		}

		{ kc_printer(kc_t("{\
\n\rpublic:\v\n"), kc_current_view); }
		kc::unparse(additional_members, kc_printer, view_count_nonstaticmembers);
		if (f_listelementphylum(id)->eq(f_emptyId()) &&
		    !f_constructors_in_phylumdecl(this) && gl_no_of_args!=0) 
		{
		    { kc_printer(kc_t("explicit impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("()\v\n: "), kc_current_view); }
		    kc::unparse(gl_members, kc_printer, view_gen_user_assignment_inis);
		    { kc_printer(kc_t(" { }\r\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("   static const enum_phyla phylum_sel_;\n"), kc_current_view); }
		if(!g_options.no_printdot) 
		{
		    { kc_printer(kc_t("    void fprintdot( FILE*, const char*, const char*, const char*, bool, bool, bool ) const;\
\n"), kc_current_view); }
		}
		if(!g_options.no_rewrite && g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" rewrite(rview v) { return phylum_cast<"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">(impl_abstract_phylum::rewrite(v)); }\
\n"), kc_current_view); }
		}
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("   abstract_phylum_ref* new_phylum_ref() {\
\n	return new phylum_ref<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">(this);\
\n    }\
\n    impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("& operator=(const impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("& p) {\
\n	phylum_ref<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">* my_ref=static_cast<phylum_ref<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">*>(get_ref());\
\n	"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" self=this;\
\n	if(my_ref) {\
\n	    abstract_phylum_ref* ref=p.get_ref();\
\n	    self=const_cast<"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">(&p);\
\n	    if(ref)\
\n		self=phylum_cast<"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">(self->copy(true));\
\n	    my_ref->set_phylum(self);\
\n	}\
\n	return *self;\
\n    }\
\n    impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("& operator=(const phylum_ref<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">& r) {\
\n	phylum_ref<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">* my_ref=static_cast<phylum_ref<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">*>(get_ref());\
\n	"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" self=this;\
\n	if(my_ref) {\
\n	    self=phylum_cast<"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">(r.get_phylum()?r.get_phylum()->copy(true):0);\
\n	    my_ref->set_phylum(self);\
\n	}\
\n	return *self;\
\n    }\
\n\
\n    impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("* return_ptr() { if(get_ref()) get_ref()->lock(); return this; }\
\n"), kc_current_view); }
		}
		kc::unparse(cco, kc_printer, view_gen_nodetypes_h);
		kc::unparse(additional_members, kc_printer, view_gen_member_dcl_h);
		kc::unparse(this, kc_printer, view_gen_listdecls_h);
		{ kc_printer(kc_t("};\
\n"), kc_current_view); }
		kc::unparse(alt, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdecls1_h_enum: {
	    view_gen_classdecls1_h_class& kc_current_view=static_cast<view_gen_classdecls1_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives) && (phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1->prod_sel() == sel_Consalternatives) && ((phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const ID id = this->ID_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1)->alternative_1)->ID_1;
		{ kc_printer(kc_t("class impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("typedef phylum_ptr<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t("> "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr;\
\n"), kc_current_view); }
		}
		if(g_options.weak_pointer) 
		{
		    { kc_printer(kc_t("typedef weak_phylum_ptr<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t("> weak_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr;\
\n"), kc_current_view); }
		}
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("class impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("typedef phylum_ptr<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("> "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr;\
\n"), kc_current_view); }
		}
		if(g_options.weak_pointer) 
		{
		    { kc_printer(kc_t("typedef weak_phylum_ptr<impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("> weak_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr;\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		alternative a = f_alternativeofoperator(gl_operator); 
			view_gen_unparsedefs_default_c_class vgudcL(/* is list ? */ true, kc_current_view.isOnlyDefault);
		kc::unparse(a, kc_printer, vgudcL);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		alternative a = f_alternativeofoperator(gl_operator); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
	    {
		const ID id = this->ID_1;
		const productionblock pb = this->productionblock_1;
		ID selvar = Id(Str(mkcasestring("this")));

		dollarvarstack.push( selvar );
		dollarvarextstack.push( f_emptyId() );
		gl_phylum = id; 
		kc::unparse(pb, kc_printer, kc_current_view);
		gl_phylum = 0;

		dollarvarstack.pop();
		dollarvarextstack.pop();

	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const ID id = this->ID_1;
	    } else
	    {
		const ID id = this->ID_1;
		const productionblock pb = this->productionblock_1;
		gl_phydecl = f_lookupdecl( id );
		gl_phylum = id;
		if ( gl_phydecl == 0 ) {
		    v_report(NonFatal( FileLine( gl_phylum->file, gl_phylum->line ), Problem1S1ID( "internal error: could not find declaration of phylum:", gl_phylum )));
		}

		kc::unparse(pb, kc_printer, kc_current_view);
		gl_phydecl = 0;
		gl_phylum = 0;

	    }
	    break;
	}
	case view_gen_copy_attributes_c_enum: {
	    view_gen_copy_attributes_c_class& kc_current_view=static_cast<view_gen_copy_attributes_c_class&>(kc_current_view_base);
	    if ((this->Ccode_option_1->prod_sel() == sel_CcodeOption) && (phylum_cast<const impl_Ccode_option_CcodeOption*>(this->Ccode_option_1)->attributes_1->prod_sel() == sel_Consattributes) && ((phylum_cast<const impl_Ccode_option_CcodeOption*>(this->Ccode_option_1)->attributes_1)->attribute_1->prod_sel() == sel_Attribute) && ((phylum_cast<const impl_Ccode_option_CcodeOption*>(this->Ccode_option_1)->attributes_1)->attributes_1->prod_sel() == sel_Nilattributes)) {
		const ID id = this->ID_1;
		const ID aid = phylum_cast<const impl_attribute_Attribute*>((phylum_cast<const impl_Ccode_option_CcodeOption*>(this->Ccode_option_1)->attributes_1)->attribute_1)->ID_2;
		{ kc_printer(kc_t("   case phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(":\v\
\n	dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p2)->"), kc_current_view); }
		kc::unparse(aid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = dynamic_cast<c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p1)->"), kc_current_view); }
		kc::unparse(aid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n	break;\r\n"), kc_current_view); }
	    } else
		if ((this->Ccode_option_1->prod_sel() == sel_CcodeOption) && (phylum_cast<const impl_Ccode_option_CcodeOption*>(this->Ccode_option_1)->attributes_1->prod_sel() == sel_Nilattributes)) {
		const ID id = this->ID_1;
	    } else
		if ((this->Ccode_option_1->prod_sel() == sel_CcodeOption)) {
		const ID id = this->ID_1;
		const attributes a = phylum_cast<const impl_Ccode_option_CcodeOption*>(this->Ccode_option_1)->attributes_1;
		{ kc_printer(kc_t("   case phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": {\
\n    c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" p1 = dynamic_cast<c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p1);\
\n"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" p2 = dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p2);\
\n"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	break;\
\n    }\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_listdefs_c_enum: {
	    view_gen_listdefs_c_class& kc_current_view=static_cast<view_gen_listdefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nconcat(c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_p1, c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_p2)\
\n{ return dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p1->do_concat(kc_p2, sel_Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")); }\
\n"), kc_current_view); }
		covariant_choice(id, "\nimpl_", "::reverse() const", "abstract_list\nimpl_", "::reverse() const",
		    kc_printer, kc_current_view); 
			{ kc_printer(kc_t("\n{ return dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(do_reverse(Nil"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("(), sel_Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")); }\
\n\
\n"), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::last() const\
\n{ return dynamic_cast<"), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(impl_abstract_list::last()); }\
\n\
\nbool\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::is_nil() const\
\n{\
\n  return "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1==0 && "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1==0;\
\n}\
\n\
\n"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::map("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" (*kc_fp)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("))\
\n{ return dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(do_map((abstract_phylum (*)(abstract_phylum))kc_fp, sel_Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")); }\
\n"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::filter(bool (*kc_fp)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("))\
\n{ return dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(do_filter((bool (*)(abstract_phylum))kc_fp, sel_Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")); }\
\n\
\n"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::append("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" new_last)\
\n{\
\n  return dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(do_append(new_last, Nil"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("()));\
\n}\
\n"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::merge( "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" second, "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" (*kc_fp)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("))\
\n{\
\n    return dynamic_cast<"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(do_merge(second,(abstract_phylum(*)(abstract_phylum,abstract_phylum))kc_fp, sel_Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n}\
\n"), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\nimpl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::reduce( "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" neutral, "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" (*kc_fp)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("))\
\n{\
\n    return dynamic_cast<"), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(do_reduce(neutral,(abstract_phylum(*)(abstract_phylum,abstract_phylum))kc_fp));\
\n}\
\n\
\n"), kc_current_view); }
	    } else
	    {
	    }
	    break;
	}
	case view_gen_listdecls_h_enum: {
	    view_gen_listdecls_h_class& kc_current_view=static_cast<view_gen_listdecls_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		{ kc_printer(kc_t("   enum_operators prod_sel() const{\
\n      return is_nil() ? sel_Nil"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": sel_Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n    }\
\n    explicit impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = 0, "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = 0);\
\n    abstract_phylum subphylum(int) const;\
\n    void set_subphylum(int, abstract_phylum);\
\n    friend "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" concat(c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\n"), kc_current_view); }
		if (g_options.covariant=='p') 
		{
		    { kc_printer(kc_t("#ifndef NO_COVARIANT_RETURN\n"), kc_current_view); }
		}
		if (g_options.covariant!='n') 
		{
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" reverse() const;\n"), kc_current_view); }
		    if(!g_options.no_rewrite && !g_options.rw_loop) 
		    {
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" rewrite(rview);\
\n"), kc_current_view); }
		    }
		}
		if (g_options.covariant=='p') 
		{
		    { kc_printer(kc_t("#else\n"), kc_current_view); }
		}
		if (g_options.covariant!='y') 
		{
		    { kc_printer(kc_t("    abstract_list reverse() const;\
\n"), kc_current_view); }
		    if(!g_options.no_rewrite && !g_options.rw_loop) 
		    {
			{ kc_printer(kc_t("	abstract_phylum rewrite(rview);\
\n"), kc_current_view); }
		    }
		}
		if (g_options.covariant=='p') 
		{
		    { kc_printer(kc_t("#endif // NO_COVARIANT_RETURN\n"), kc_current_view); }
		}
		if(!g_options.no_rewrite && g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	abstract_phylum do_rewrite(rview);\
\n"), kc_current_view); }
		}
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" last() const;\
\n    "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" append("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n    "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" map("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" (*)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n    "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" filter( bool (*)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n    "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" merge( "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" (*)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n    "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" reduce( "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" (*)("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n    bool is_nil() const;\
\n"), kc_current_view); }
		if(g_options.smart_pointer) 
		{
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr "), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_1;\
\n    "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_1;\
\n"), kc_current_view); }
		}
		else 
		{
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" "), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_1;\
\n    "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_1;\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("\rprivate:\v\n"), kc_current_view); }
		if(!g_options.no_rewrite && !g_options.rw_loop) 
		{
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#ifndef NO_COVARIANT_RETURN\n"), kc_current_view); }
		    }
		    if (g_options.covariant!='n') 
		    {
			{ kc_printer(kc_t("	    impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("* nil_rewrite(rview);\
\n	    impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("* cons_rewrite(rview);\
\n"), kc_current_view); }
		    }
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#else\n"), kc_current_view); }
		    }
		    if (g_options.covariant!='y') 
		    {
			{ kc_printer(kc_t("	    impl_abstract_phylum* nil_rewrite(rview);\
\n	    impl_abstract_phylum* cons_rewrite(rview);\
\n"), kc_current_view); }
		    }
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#endif // NO_COVARIANT_RETURN\n"), kc_current_view); }
		    }
		}
		if (!g_options.no_unparse) 
		{
		    { kc_printer(kc_t("	void nil_do_unparse(printer_functor, uview);\
\n	void do_unparse(printer_functor, uview);\
\n"), kc_current_view); }
		}
	    } else
	    {
		const ID id = this->ID_1;
		if (g_options.covariant!='n') 
		{
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#ifndef NO_COVARIANT_RETURN\n"), kc_current_view); }
		    }
		    if(!g_options.no_rewrite && !g_options.rw_loop) 
		    {
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" rewrite(rview) =0;\n"), kc_current_view); }
		    }
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#endif // NO_COVARIANT_RETURN\n"), kc_current_view); }
		    }
		}
	    }
	    break;
	}
	case view_gen_printdotdefs_c_enum: {
	    view_gen_printdotdefs_c_class& kc_current_view=static_cast<view_gen_printdotdefs_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("void impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::fprintdot(FILE *f, const char *root_label_prefix, const char *edge_label_prefix, const char *edge_attributes, bool print_node_labels, bool use_context_when_sharing_leaves, bool print_prologue_and_epi"), kc_current_view );
		  kc_printer(kc_t("logue) const\
\n{\
\n    int kc_edge_nr = 1;\
\n    kc_dotedgenode_t kc_edges = 0;\
\n    if (print_prologue_and_epilogue) fprintdotprologue(f);\
\n    /*if (kc_outmost)*/ kc_do_printdot_subgraph_prolo"), kc_current_view );
		  kc_printer(kc_t("gue(f, this, root_label_prefix, edge_attributes, print_node_labels, use_context_when_sharing_leaves);\
\n    fprintdot_hashtable = new kc_dotedge_ht;\
\n    do_printdot(f, true, &kc_edge_nr, &kc_edges,"), kc_current_view );
		  kc_printer(kc_t(" edge_label_prefix, print_node_labels, use_context_when_sharing_leaves, 0, 0);\
\n    kc_do_printdot_edges(f, kc_edges, edge_attributes, use_context_when_sharing_leaves);\
\n    delete fprintdot_hashta"), kc_current_view );
		  kc_printer(kc_t("ble;\
\n	fprintdot_hashtable=0;\
\n    /*if (kc_outmost)*/ kc_do_printdot_subgraph_epilogue(f);\
\n    if (print_prologue_and_epilogue) fprintdotepilogue(f);\
\n}\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("void impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::fprintdot(FILE *f, const char *root_label_prefix, const char *edge_label_prefix, const char *edge_attributes, bool print_node_labels, bool use_context_when_sharing_leaves, bool print_prologue_and_epi"), kc_current_view );
		  kc_printer(kc_t("logue) const\
\n{\
\n    int kc_edge_nr = 1;\
\n    kc_dotedgenode_t kc_edges = 0;\
\n    if (print_prologue_and_epilogue) fprintdotprologue(f);\
\n    /*if (kc_outmost)*/ kc_do_printdot_subgraph_prolo"), kc_current_view );
		  kc_printer(kc_t("gue(f, this, root_label_prefix, edge_attributes, print_node_labels, use_context_when_sharing_leaves);\
\n    fprintdot_hashtable = new kc_dotedge_ht;\
\n    do_printdot(f, true, &kc_edge_nr, &kc_edges,"), kc_current_view );
		  kc_printer(kc_t(" edge_label_prefix, print_node_labels, use_context_when_sharing_leaves, 0, 0);\
\n    kc_do_printdot_edges(f, kc_edges, edge_attributes, use_context_when_sharing_leaves);\
\n    delete fprintdot_hashta"), kc_current_view );
		  kc_printer(kc_t("ble;\
\n	fprintdot_hashtable=0;\
\n    /*if (kc_outmost)*/ kc_do_printdot_subgraph_epilogue(f);\
\n    if (print_prologue_and_epilogue) fprintdotepilogue(f);\
\n}\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("void impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::fprintdot(FILE *f, const char *root_label_prefix, const char *edge_label_prefix, const char *edge_attributes, bool print_node_labels, bool use_context_when_sharing_leaves, bool print_prologue_and_epi"), kc_current_view );
		  kc_printer(kc_t("logue) const\
\n{\
\n    int kc_edge_nr = 1;\
\n    kc_dotedgenode_t kc_edges = 0;\
\n    if (print_prologue_and_epilogue) fprintdotprologue(f);\
\n    /*if (kc_outmost)*/ kc_do_printdot_subgraph_prolo"), kc_current_view );
		  kc_printer(kc_t("gue(f, this, root_label_prefix, edge_attributes, print_node_labels, use_context_when_sharing_leaves);\
\n    fprintdot_hashtable = new kc_dotedge_ht;\
\n    do_printdot(f, true, &kc_edge_nr, &kc_edges,"), kc_current_view );
		  kc_printer(kc_t(" edge_label_prefix, print_node_labels, use_context_when_sharing_leaves, 0, 0);\
\n    kc_do_printdot_edges(f, kc_edges, edge_attributes, use_context_when_sharing_leaves);\
\n    delete fprintdot_hashta"), kc_current_view );
		  kc_printer(kc_t("ble;\
\n	fprintdot_hashtable=0;\
\n    /*if (kc_outmost)*/ kc_do_printdot_subgraph_epilogue(f);\
\n    if (print_prologue_and_epilogue) fprintdotepilogue(f);\
\n}\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const alternatives a = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents; 
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents; 
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const ID id = this->ID_1;
		const alternatives a = phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1;
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents; 
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_create_function_enum: {
	    view_gen_create_function_class& kc_current_view=static_cast<view_gen_create_function_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const alternatives alts = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(alts, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const alternatives alts = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(alts, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatordefs_c_enum: {
	    view_gen_operatordefs_c_class& kc_current_view=static_cast<view_gen_operatordefs_c_class&>(kc_current_view_base);
	    if ((this->storageoption_1->prod_sel() == sel_NoStorageOption) && (this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_cco = cco; 
		kc::unparse(alts, kc_printer, view_gen_operatordefs_nonhash_c);
		gl_phylum = 0; gl_cco = (Ccode_option)0; 
			} else
		if ((this->storageoption_1->prod_sel() == sel_NegativeStorageOption) && (this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_cco = cco; 
		kc::unparse(alts, kc_printer, view_gen_operatordefs_nonhash_c);
		gl_phylum = 0; gl_cco = (Ccode_option)0; 
			} else
		if ((this->storageoption_1->prod_sel() == sel_NoStorageOption) && (this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_cco = cco; 
		kc::unparse(alts, kc_printer, view_gen_operatordefs_nonhash_c);
		gl_phylum = 0; gl_cco = (Ccode_option)0; 
			} else
		if ((this->storageoption_1->prod_sel() == sel_NegativeStorageOption) && (this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_cco = cco; 
		kc::unparse(alts, kc_printer, view_gen_operatordefs_nonhash_c);
		gl_phylum = 0; gl_cco = (Ccode_option)0; 
			} else
		if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption) && (this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID sto = phylum_cast<const impl_storageoption_PositiveStorageOption*>(this->storageoption_1)->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_cco = cco; gl_sto = sto; 
		kc::unparse(alts, kc_printer, view_gen_operatordefs_hash_c);
		gl_phylum = 0; gl_cco = (Ccode_option)0; gl_sto = 0; 
			} else
		if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption) && (this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const ID sto = phylum_cast<const impl_storageoption_PositiveStorageOption*>(this->storageoption_1)->ID_1;
		const alternatives alts = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_cco = cco; gl_sto = sto; 
		kc::unparse(alts, kc_printer, view_gen_operatordefs_hash_c);
		gl_phylum = 0; gl_cco = (Ccode_option)0; gl_sto = 0; 
			} else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		{ kc_printer(kc_t("//"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" Nil"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("();\
\n    //"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(","), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const ID el = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->ID_1;
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" Nil"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("();\
\n    "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" Cons"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(el, kc_printer, kc_current_view);
		{ kc_printer(kc_t(","), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_yaccstacktype_h_enum: {
	    view_gen_yaccstacktype_h_class& kc_current_view=static_cast<view_gen_yaccstacktype_h_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("    kc::"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" yt_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_nodetypedefs_h_enum: {
	    view_gen_nodetypedefs_h_class& kc_current_view=static_cast<view_gen_nodetypedefs_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives) && (phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1->prod_sel() == sel_Consalternatives) && ((phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const ID id = this->ID_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1)->alternative_1)->ID_1;
		{ kc_printer(kc_t("typedef impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" *"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\ntypedef const impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" *c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("typedef impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" *"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\ntypedef const impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" *c_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatormap_attributes_enum: {
	    view_gen_operatormap_attributes_class& kc_current_view=static_cast<view_gen_operatormap_attributes_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const alternatives a = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents; 
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents; 
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const ID id = this->ID_1;
		const alternatives a = phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1;
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents; 
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatormap_c_enum: {
	    view_gen_operatormap_c_class& kc_current_view=static_cast<view_gen_operatormap_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const storageoption st_opt = this->storageoption_1;
		const alternatives a = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_storageoption = st_opt; gl_atomicity = false; 
		kc::unparse(a, kc_printer, kc_current_view);
		gl_phylum = 0; gl_storageoption = 0; 
			} else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const storageoption st_opt = this->storageoption_1;
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_storageoption = st_opt; gl_atomicity = false; 
		kc::unparse(a, kc_printer, kc_current_view);
		gl_phylum = 0; gl_storageoption = 0; 
			} else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const ID id = this->ID_1;
		const storageoption st_opt = this->storageoption_1;
		const alternatives a = phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; gl_storageoption = st_opt; gl_atomicity = true; 
		kc::unparse(a, kc_printer, kc_current_view);
		gl_phylum = 0; gl_storageoption = 0; 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const storageoption st_opt = this->storageoption_1;
		const productionblock pb = this->productionblock_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; 
			{ kc_printer(kc_t("    { \""), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(pb, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(st_opt, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" },\
\n"), kc_current_view); }
		gl_phylum = 0; 
			} else
	    {
		const ID id = this->ID_1;
		const storageoption st_opt = this->storageoption_1;
		const productionblock pb = this->productionblock_1;
		const Ccode_option cco = this->Ccode_option_1;
		gl_phylum = id; 
			{ kc_printer(kc_t("    { \""), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(pb, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(st_opt, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" },\
\n"), kc_current_view); }
		gl_phylum = 0; 
	    }
	    break;
	}
	case view_gen_enumoperators_h_enum: {
	    view_gen_enumoperators_h_class& kc_current_view=static_cast<view_gen_enumoperators_h_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_ListAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_NonlistAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
		const alternatives a = phylum_cast<const impl_productionblock_PredefinedAlternatives*>(this->productionblock_1)->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_enumphyla_h_enum: {
	    view_gen_enumphyla_h_class& kc_current_view=static_cast<view_gen_enumphyla_h_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const productionblock productions = this->productionblock_1;
		{ kc_printer(kc_t("    phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = "), kc_current_view); }
		kc::unparse(g_no_of_phyla, kc_printer, kc_current_view);
		{ kc_printer(kc_t(",\
\n"), kc_current_view); }
		g_no_of_phyla++; 
	    }
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const productionblock productions = this->productionblock_1;
		{ kc_printer(kc_t("#define kc_phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" phylum_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		gl_phylum = id;
		kc::unparse(productions, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq2_enum: {
	    view_check_uniq2_class& kc_current_view=static_cast<view_check_uniq2_class&>(kc_current_view_base);
	    if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption) && (this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption) && (this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
	    } else
		if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption) && (this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
	    } else
		if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption) && (this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		if (! this->marked) 
		{
		    v_report(NonFatal( FileLine( cl_storageID->file, cl_storageID->line ),
			    Problem1S1ID1S1ID( "'uniq' declared phylum:", cl_uniqueID,
				"has non 'uniq' (transitive) subterm:", id) ));
		    (this)->marked = 1;

		    kc::unparse(this, kc_printer, view_check_uniq1);
		}
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		if (! this->marked) 
		{
		    v_report(NonFatal( FileLine( cl_storageID->file, cl_storageID->line ),
			    Problem1S1ID1S1ID( "'uniq' declared phylum:", cl_uniqueID,
				"has non 'uniq' (transitive) subterm:", id) ));
		    (this)->marked = 1;

		    kc::unparse(this, kc_printer, view_check_uniq1);
		}
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const productionblock pb = this->productionblock_1;
		kc::unparse(pb, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq_enum: {
	    view_check_uniq_class& kc_current_view=static_cast<view_check_uniq_class&>(kc_current_view_base);
	    if ((this->storageoption_1->prod_sel() == sel_NoStorageOption)) {
		const productionblock pb = this->productionblock_1;
		kc::unparse(pb, kc_printer, kc_current_view);
	    } else
		if ((this->storageoption_1->prod_sel() == sel_NegativeStorageOption)) {
	    } else
		if ((this->storageoption_1->prod_sel() == sel_PositiveStorageOption)) {
		const ID id = this->ID_1;
		const ID s_id = phylum_cast<const impl_storageoption_PositiveStorageOption*>(this->storageoption_1)->ID_1;
		const productionblock pb = this->productionblock_1;
		this->marked = 1;
		cl_uniqueID = id;
		cl_storageID = s_id;

		kc::unparse(pb, kc_printer, view_check_uniq1);
		v_reset_phylumdeclaration_marks();
		cl_uniqueID = 0;
		cl_storageID = 0;

	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_PredefinedAlternatives)) {
	    } else
		if ((this->productionblock_1->prod_sel() == sel_ListAlternatives)) {
		const ID id = this->ID_1;
		const productionblock a = this->productionblock_1;
		const Ccode_option cco = this->Ccode_option_1;
		if (f_something_to_initialize( cco )) 
		{
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_initialize_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_x)\
\n{\
\n"), kc_current_view); }
		    kc::unparse(cco, kc_printer, kc_current_view);
		    kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		    { kc_printer(kc_t("    return kc_x;\
\n}\
\n\
\n"), kc_current_view); }
		}
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		if ((this->productionblock_1->prod_sel() == sel_NonlistAlternatives)) {
		const ID id = this->ID_1;
		const productionblock a = this->productionblock_1;
		const Ccode_option cco = this->Ccode_option_1;
		if (f_something_to_initialize( cco )) 
		{
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_initialize_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_x)\
\n{\
\n"), kc_current_view); }
		    kc::unparse(cco, kc_printer, kc_current_view);
		    kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		    { kc_printer(kc_t("    return kc_x;\
\n}\
\n\
\n"), kc_current_view); }
		}
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    if ((this->productionblock_1->prod_sel() == sel_Emptyproductionblock)) {
		const ID id = this->ID_1;
		const storageoption stopt = this->storageoption_1;
		gl_phylum = id; 
		kc::unparse(stopt, kc_printer, kc_current_view);
		gl_phylum = 0; 
		 v_report(NonFatal( NoFileLine(),
			Problem1S1ID( "no operators defined for phylum", id ))); 
			} else
	    {
		const ID id = this->ID_1;
		const storageoption stopt = this->storageoption_1;
		const productionblock pb = this->productionblock_1;
		gl_phylum = id; 
		kc::unparse(stopt, kc_printer, kc_current_view);
		gl_phylum = 0; 
		kc::unparse(pb, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID i = this->ID_1;
		const Ccode_option cco = this->Ccode_option_1;
		outmostoperators.push( Niloperators() );
		dollarvarsallowed.push( DVAllowed() );
		phylumstack.push( i );

		kc::unparse(cco, kc_printer, kc_current_view);
		outmostoperators.top()->freelist();
		outmostoperators.pop();
		dollarvarsallowed.pop();
		phylumstack.pop();

	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_storageoption_PositiveStorageOption::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
		const ID sc = this->ID_1;
		kc::unparse(sc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
		const ID sc = this->ID_1;
		if (pg_storageclasseshavebeendefined)
		f_useoccurstorageclass( sc );
		else v_extendoccur( sc, ITStorageClass() );
		v_add_to_storageclasses( sc, gl_phylum );

	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("{ "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" } at "), kc_current_view); }
		kc::unparse(id->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t(":"), kc_current_view); }
		kc::unparse(id->line, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_storageoption_NegativeStorageOption::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("kc_not_uniq"), kc_current_view); }
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
		const ID sc = this->ID_1;
		if (pg_storageclasseshavebeendefined)
		f_useoccurstorageclass( sc );
		else v_extendoccur( sc, ITStorageClass() );
		v_add_to_storageclasses( sc, gl_phylum );

	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("{! "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" } at "), kc_current_view); }
		kc::unparse(id->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t(":"), kc_current_view); }
		kc::unparse(id->line, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_storageoption_NoStorageOption::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("kc_not_uniq"), kc_current_view); }
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_storageclasses::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_operatordefs_c_2_enum: {
	    view_gen_operatordefs_c_2_class& kc_current_view=static_cast<view_gen_operatordefs_c_2_class&>(kc_current_view_base);
	    {
		const ID sc = this->ID_1;
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t("&"), kc_current_view); }
		kc::unparse(sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_static_hashtable,\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatordefs_c_1_enum: {
	    view_gen_operatordefs_c_1_class& kc_current_view=static_cast<view_gen_operatordefs_c_1_class&>(kc_current_view_base);
	    if ((this->storageclasses_1->prod_sel() == sel_Nilstorageclasses)) {
		{ kc_printer(kc_t("true"), kc_current_view); }
	    } else
	    {
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", true"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatordefs_c_0_enum: {
	    view_gen_operatordefs_c_0_class& kc_current_view=static_cast<view_gen_operatordefs_c_0_class&>(kc_current_view_base);
	    {
		const ID sc = this->ID_1;
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t("static hashtable_struct_t "), kc_current_view); }
		kc::unparse(sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_static_hashtable;\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatordefs_c_enum: {
	    view_gen_operatordefs_c_class& kc_current_view=static_cast<view_gen_operatordefs_c_class&>(kc_current_view_base);
	    if ((this->storageclasses_1->prod_sel() == sel_Nilstorageclasses)) {
		const ID sc = this->ID_1;
		{ kc_printer(kc_t("\""), kc_current_view); }
		kc::unparse(sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    } else
	    {
		const ID sc = this->ID_1;
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", \""), kc_current_view); }
		kc::unparse(sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}
	case view_gen_uniqmap_c_2_enum: {
	    view_gen_uniqmap_c_2_class& kc_current_view=static_cast<view_gen_uniqmap_c_2_class&>(kc_current_view_base);
	    if ((this->storageclasses_1->prod_sel() == sel_Nilstorageclasses)) {
		const ID sc = this->ID_1;
		if (this->phyla->length() > 0) 
		{
		    { kc_printer(kc_t("    phylumstorageclass_"), kc_current_view); }
		    kc::unparse(sc, kc_printer, kc_current_view);
		}
		else 
		{
		    { kc_printer(kc_t("    (KC_UNIQ_INFO)0"), kc_current_view); }
		}
	    } else
	    {
		const ID sc = this->ID_1;
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		if (this->phyla->length() > 0) 
		{
		    { kc_printer(kc_t(",\
\n    phylumstorageclass_"), kc_current_view); }
		    kc::unparse(sc, kc_printer, kc_current_view);
		}
		else 
		{
		    { kc_printer(kc_t(",\
\n    (KC_UNIQ_INFO)0"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_uniqmap_c_1_enum: {
	    view_gen_uniqmap_c_1_class& kc_current_view=static_cast<view_gen_uniqmap_c_1_class&>(kc_current_view_base);
	    {
		const ID sc = this->ID_1;
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		if (this->phyla->length() > 0) 
		{
		    { kc_printer(kc_t("static enum_phyla phylumstorageclass_"), kc_current_view); }
		    kc::unparse(sc, kc_printer, kc_current_view);
		    { kc_printer(kc_t("[] = { one_before_first_phylum, "), kc_current_view); }
		    kc::unparse(this->phyla, kc_printer, kc_current_view);
		    { kc_printer(kc_t("last_phylum };\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_uniqmap_c_enum: {
	    view_gen_uniqmap_c_class& kc_current_view=static_cast<view_gen_uniqmap_c_class&>(kc_current_view_base);
	    {
		kc::unparse(this, kc_printer, view_gen_uniqmap_c_1);
		{ kc_printer(kc_t("\
\nKC_UNIQ_INFO kc_UniqInfo[] = {\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_uniqmap_c_2);
		{ kc_printer(kc_t("\
\n};\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_operatormap_type_h_enum: {
	    view_gen_operatormap_type_h_class& kc_current_view=static_cast<view_gen_operatormap_type_h_class&>(kc_current_view_base);
	    if ((this->storageclasses_1->prod_sel() == sel_Nilstorageclasses)) {
		const ID sc = this->ID_1;
		kc::unparse(sc, kc_printer, kc_current_view);
	    } else
	    {
		const ID sc = this->ID_1;
		const storageclasses r_sc = this->storageclasses_1;
		kc::unparse(r_sc, kc_printer, kc_current_view);
		{ kc_printer(kc_t(",\
\n	"), kc_current_view); }
		kc::unparse(sc, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (storageclasses iterator_ = this; iterator_->storageclasses_1 != 0; iterator_ = iterator_->storageclasses_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_storageclasses::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_operatordefs_c_2_enum: {
	    view_gen_operatordefs_c_2_class& kc_current_view=static_cast<view_gen_operatordefs_c_2_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordefs_c_1_enum: {
	    view_gen_operatordefs_c_1_class& kc_current_view=static_cast<view_gen_operatordefs_c_1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordefs_c_0_enum: {
	    view_gen_operatordefs_c_0_class& kc_current_view=static_cast<view_gen_operatordefs_c_0_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordefs_c_enum: {
	    view_gen_operatordefs_c_class& kc_current_view=static_cast<view_gen_operatordefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_uniqmap_c_2_enum: {
	    view_gen_uniqmap_c_2_class& kc_current_view=static_cast<view_gen_uniqmap_c_2_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_uniqmap_c_1_enum: {
	    view_gen_uniqmap_c_1_class& kc_current_view=static_cast<view_gen_uniqmap_c_1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_uniqmap_c_enum: {
	    view_gen_uniqmap_c_class& kc_current_view=static_cast<view_gen_uniqmap_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_type_h_enum: {
	    view_gen_operatormap_type_h_class& kc_current_view=static_cast<view_gen_operatormap_type_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_productionblock_PredefinedAlternatives::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative) && ((this->alternatives_1)->alternatives_1->prod_sel() == sel_Nilalternatives)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		{ kc_printer(kc_t("sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
		if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		const alternatives ra = (this->alternatives_1)->alternatives_1;
		{ kc_printer(kc_t("sel_"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const alternatives alt = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_productionblock_NonlistAlternatives::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
		const alternatives alts = this->alternatives_1;
		kc::unparse(alts, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
		const alternatives alts = this->alternatives_1;
		kc::unparse(alts, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative) && ((this->alternatives_1)->alternatives_1->prod_sel() == sel_Nilalternatives)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		{ kc_printer(kc_t("sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
		if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		const alternatives ra = (this->alternatives_1)->alternatives_1;
		{ kc_printer(kc_t("sel_"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const alternatives alt = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
		const alternatives alt = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_productionblock_ListAlternatives::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative) && ((this->alternatives_1)->alternatives_1->prod_sel() == sel_Consalternatives) && (((this->alternatives_1)->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative consa = (this->alternatives_1)->alternative_1;
		const ID consid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		const alternative nila = ((this->alternatives_1)->alternatives_1)->alternative_1;
		const ID nilid = phylum_cast<const impl_alternative_Alternative*>(((this->alternatives_1)->alternatives_1)->alternative_1)->ID_1;
		{ kc_printer(kc_t("void\
\nimpl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::do_unparse(printer_functor kc_printer, uview kc_current_view_base)\
\n{\
\n    if(is_nil())\
\n	nil_do_unparse(kc_printer, kc_current_view_base);\
\n    else\
\n	switch(kc_current_view_base) {\
\n"), kc_current_view); }
		unparseviewsinfo a_unparseviewsinfo = f_unparseviewsinfo_of_alternative( consa, Theuviewnames );
		gl_operator = consid; 
		kc::unparse(a_unparseviewsinfo, kc_printer, view_gen_unparsedefs_c);
		{ kc_printer(kc_t("	}\
\n}\
\n\
\nvoid\
\nimpl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)\
\n{\
\n    switch(kc_current_view_base) {\
\n"), kc_current_view); }
		freespineandelements(a_unparseviewsinfo);
		a_unparseviewsinfo = f_unparseviewsinfo_of_alternative( nila, Theuviewnames );
		gl_operator = nilid; 
		kc::unparse(a_unparseviewsinfo, kc_printer, view_gen_unparsedefs_c);
		{ kc_printer(kc_t("    }\
\n}\
\n\
\n"), kc_current_view); }
		freespineandelements(a_unparseviewsinfo); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative) && ((this->alternatives_1)->alternatives_1->prod_sel() == sel_Consalternatives)) {
		const alternative consa = (this->alternatives_1)->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		const alternative nila = ((this->alternatives_1)->alternatives_1)->alternative_1;
		gl_phylum = f_phylumofoperator(oid); 
		 if(!g_options.rw_loop) 
		{
		    covariant_choice(gl_phylum, "", "abstract_phylum", kc_printer, kc_current_view); 
		     }
		else 
		{
		    { kc_printer(kc_t("abstract_phylum"), kc_current_view); }
		}
		{ kc_printer(kc_t(" impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::"), kc_current_view); }
		if(f_rewrite_in_operatordecl(consa) || g_options.rw_loop) 
		{
		    { kc_printer(kc_t("do_"), kc_current_view); }
		}
		{ kc_printer(kc_t("rewrite(rview kc_current_view_base)\
\n{\
\n    if (is_nil()) {\
\n"), kc_current_view); }
		kc::unparse(nila, kc_printer, view_gen_rewritedefs_body_c);
		{ kc_printer(kc_t("   } else { // not Nil, Cons\
\n"), kc_current_view); }
		kc::unparse(consa, kc_printer, view_gen_rewritedefs_body_c);
		{ kc_printer(kc_t("   }\
\n}\
\n"), kc_current_view); }
		gl_phylum = 0; 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative) && ((this->alternatives_1)->alternatives_1->prod_sel() == sel_Nilalternatives)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		{ kc_printer(kc_t("sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
		if ((this->alternatives_1->prod_sel() == sel_Consalternatives) && ((this->alternatives_1)->alternative_1->prod_sel() == sel_Alternative)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>((this->alternatives_1)->alternative_1)->ID_1;
		const alternatives ra = (this->alternatives_1)->alternatives_1;
		{ kc_printer(kc_t("sel_"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const alternatives alt = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const alternatives a = this->alternatives_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
		const alternatives alt = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_productionblock_Emptyproductionblock::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_alternatives::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_set_subphylumdefs_c_enum: {
	    view_gen_set_subphylumdefs_c_class& kc_current_view=static_cast<view_gen_set_subphylumdefs_c_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative) && (phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1->prod_sel() == sel_Nilarguments)) {
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		ID id = f_phylumofoperator(oid); 
			{ kc_printer(kc_t("void impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::set_subphylum(int no, abstract_phylum val)\
\n{\
\n    abstract_phylum newval=0;\
\n    switch(no) {\
\n"), kc_current_view); }
		gl_no_of_args = 0; 
		kc::unparse(args, kc_printer, kc_current_view);
		{ kc_printer(kc_t("   }\
\n    assertNonNull(newval);\
\n}\
\n"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_subphylumdefs_c_enum: {
	    view_gen_subphylumdefs_c_class& kc_current_view=static_cast<view_gen_subphylumdefs_c_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative) && (phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1->prod_sel() == sel_Nilarguments)) {
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		ID id = f_phylumofoperator(oid); 
			{ kc_printer(kc_t("abstract_phylum impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::subphylum(int no) const\
\n{\
\n  switch(no){\
\n"), kc_current_view); }
		gl_no_of_args = 0; 
		kc::unparse(args, kc_printer, kc_current_view);
		{ kc_printer(kc_t("  }\
\n  return 0;\
\n}\
\n"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
		const alternative alt = this->alternative_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
		kc::unparse(ra, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(alt, kc_printer, kc_current_view);
		kc::unparse(alt, kc_printer, view_gen_nodetypes_h);
		ID pid = f_phylumofoperator(oid);
		if (f_ispredefinedphylum(pid)) {
		    f_phylumdeclofid(pid)->additional_members->unparse(kc_printer, view_gen_member_dcl_h);
		} 
		kc::unparse(alt->additional_members, kc_printer, view_gen_member_dcl_h);
		gl_operator = 0; 
		 if(!g_options.no_unparse) 
		{
		    { kc_printer(kc_t("\rprivate:\v\
\n	void do_unparse(printer_functor, uview);\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("};\
\n"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative a = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents;
		a->additional_members->unparse(kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents); 
		gl_operator=oid;
		if (gl_no_of_args) 
		{
		    { kc_printer(kc_t("case sel_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t(": switch(no) {\n"), kc_current_view); }
		    kc::unparse(gl_args, kc_printer, kc_current_view);
		    { kc_printer(kc_t("}\
\n	"), kc_current_view); }
		}
		gl_no_of_args=attrcount;
		gl_args=attrs;
		gl_idents=idents; 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_create_function_enum: {
	    view_gen_create_function_class& kc_current_view=static_cast<view_gen_create_function_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		{ kc_printer(kc_t("   \rcase sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(":\v\
\n	return "), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatordefs_hash_c_enum: {
	    view_gen_operatordefs_hash_c_class& kc_current_view=static_cast<view_gen_operatordefs_hash_c_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		gl_isnotlist = f_listelementphylum(gl_phylum)->eq(f_emptyId());
		gl_operator = oid;
		gl_args=args; 
		kc::unparse(args, kc_printer, view_count_args);
		if(f_constructors_in_operatordecl(alt)) 
		{
		    kc::unparse(alt->additional_members, kc_printer, kc_current_view);
		}
		else {

		    fndeclarations _fd = Consfndeclarations(FnAcDeclaration(Nilac_declaration_specifiers(),
			    AcDeclarator(Nopointer(), AcNoRef(), AcQualifiedDeclProto(Nilac_class_qualifier_list(),
				    AcDirectDeclId(oid),
				    AcParList(Nilac_parameter_list()),
				    AcNoQualifier())),
			    Nilac_declaration_list(), AcNoBaseInit(), NilCtext(), Id(Str(mkcasestring(""))),
			    ConstructorFn()), Nilfndeclarations());
		    UNPARSE(_fd);
		    _fd->free(false);
		} 
		 gl_args=0;
		gl_operator = 0;
		gl_isnotlist = true;

	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatordefs_nonhash_c_enum: {
	    view_gen_operatordefs_nonhash_c_class& kc_current_view=static_cast<view_gen_operatordefs_nonhash_c_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		gl_isnotlist = f_listelementphylum(gl_phylum)->eq(f_emptyId());
		gl_operator = oid;
		gl_args=args; 
		kc::unparse(args, kc_printer, view_count_args);
		if(f_constructors_in_operatordecl(alt)) 
		{
		    kc::unparse(alt->additional_members, kc_printer, kc_current_view);
		}
		else {

		    fndeclarations _fd = Consfndeclarations(FnAcDeclaration(Nilac_declaration_specifiers(),
			    AcDeclarator(Nopointer(), AcNoRef(), AcQualifiedDeclProto(Nilac_class_qualifier_list(),
				    AcDirectDeclId(oid),
				    AcParList(Nilac_parameter_list()),
				    AcNoQualifier())),
			    Nilac_declaration_list(), AcNoBaseInit(), NilCtext(), Id(Str(mkcasestring(""))),
			    ConstructorFn()), Nilfndeclarations());
		    UNPARSE(_fd);
		    _fd->free(false);
		} 
		 gl_args=0;
		gl_operator = 0;
		gl_isnotlist = true;

	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		if(f_constructors_in_operatordecl(alt)) 
		{
		    gl_args=args; 
		     v_report(NonFatal( NoFileLine(), Problem1S( "internal error: experimental operator_cast<>() unlikely to work with user-defined constructors" ))); 
		    kc::unparse(args, kc_printer, view_count_args);
		    kc::unparse(alt->additional_members, kc_printer, kc_current_view);
		    gl_args=0; 
		     }
		else 
		{
		    ID pid = f_phylumofoperator(oid); 
		    	{ kc_printer(kc_t("template <class "), kc_current_view); }
		    kc::unparse(oid, kc_printer, view_gen_fn_pointer_name);
		    { kc_printer(kc_t("*\b kc_f("), kc_current_view); }
		    kc::unparse(args, kc_printer, kc_current_view);
		    { kc_printer(kc_t(")>\
\n	 class "), kc_current_view); }
		    kc::unparse(oid, kc_printer, view_gen_fn_pointer_name);
		    { kc_printer(kc_t("*\
\n	 operator_cast("), kc_current_view); }
		    kc::unparse(pid, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_p)\
\n	 {\
\n	     if (kc_f!="), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" || kc_p->prod_sel()!=sel_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t(")\
\n		 throw std::bad_cast();\
\n	     return static_cast<class "), kc_current_view); }
		    kc::unparse(oid, kc_printer, view_gen_fn_pointer_name);
		    { kc_printer(kc_t("*>(kc_p);\
\n	 }\n\n"), kc_current_view); }
		}
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		if(f_constructors_in_operatordecl(alt)) 
		{
		    gl_args=args; 
		    kc::unparse(args, kc_printer, view_count_args);
		    kc::unparse(alt->additional_members, kc_printer, kc_current_view);
		    gl_args=0; 
		     }
		else 
		{
		    { kc_printer(kc_t("class "), kc_current_view); }
		    kc::unparse(oid, kc_printer, view_gen_fn_pointer_name);
		    { kc_printer(kc_t("*\b "), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" ("), kc_current_view); }
		    kc::unparse(args, kc_printer, kc_current_view);
		    { kc_printer(kc_t(");\n"), kc_current_view); }
		}
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatormap_attributes_enum: {
	    view_gen_operatormap_attributes_class& kc_current_view=static_cast<view_gen_operatormap_attributes_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative a = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		int attrcount = gl_no_of_args;
		arguments attrs = gl_args;
		ac_identifier_list idents = gl_idents;
		a->additional_members->unparse(kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		gl_args = concat(gl_args, attrs); 
		gl_idents = concat(gl_idents, idents);  
		if (gl_no_of_args) 
		{
		    { kc_printer(kc_t("static enum_phyla kc_attrs_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t("[] = { "), kc_current_view); }
		    kc::unparse(gl_args, kc_printer, view_gen_operatormap_subphyla);
		    { kc_printer(kc_t(" };\
\n	"), kc_current_view); }
		}
		gl_no_of_args=attrcount;
		gl_args=attrs;
		gl_idents=idents; 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		kc::unparse(args, kc_printer, view_count_args);
		if (gl_no_of_args) 
		{
		    { kc_printer(kc_t("static enum_phyla kc_subphyla_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t("[] = { "), kc_current_view); }
		    kc::unparse(args, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" };\
\n	"), kc_current_view); }
		}
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatormap_c_enum: {
	    view_gen_operatormap_c_class& kc_current_view=static_cast<view_gen_operatormap_c_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		kc::unparse(args, kc_printer, view_count_args);
		{ kc_printer(kc_t("    { \""), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(gl_no_of_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		if (gl_atomicity) 
		{
		    { kc_printer(kc_t("true"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("false"), kc_current_view); }
		}
		{ kc_printer(kc_t(", phylum_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		if (gl_no_of_args>0) 
		{
		    { kc_printer(kc_t("kc_subphyla_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t(", "), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("0, "), kc_current_view); }
		}
		The_abstract_phylum_decl->additional_members->unparse(kc_printer, view_count_attrs);
		int attrcount = gl_no_of_args;
		f_phylumdeclofid(f_phylumofoperator(oid))->additional_members->unparse(kc_printer, view_count_attrs);
		attrcount += gl_no_of_args;
		alt->additional_members->unparse(kc_printer, view_count_attrs);
		gl_no_of_args += attrcount; 
		kc::unparse(gl_no_of_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		if (gl_no_of_args>0) 
		{
		    { kc_printer(kc_t("kc_attrs_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		else 
		{
		    { kc_printer(kc_t("0"), kc_current_view); }
		}
		{ kc_printer(kc_t(", sizeof("), kc_current_view); }
		kc::unparse(oid, kc_printer, view_class_of_op);
		{ kc_printer(kc_t(") },\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative) && (this->alternatives_1->prod_sel() == sel_Nilalternatives)) {
		const ID oid = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		kc::unparse(oid, kc_printer, kc_current_view);
	    } else
	    {
		const alternatives ra = this->alternatives_1;
		kc::unparse(ra, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_enumoperators_h_enum: {
	    view_gen_enumoperators_h_class& kc_current_view=static_cast<view_gen_enumoperators_h_class&>(kc_current_view_base);
	    if ((this->alternatives_1->prod_sel() == sel_Nilalternatives)) {
		const alternative a = this->alternative_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
	    {
		const alternative a = this->alternative_1;
		const alternatives as = this->alternatives_1;
		kc::unparse(as, kc_printer, kc_current_view);
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const alternative a = this->alternative_1;
		const alternatives as = this->alternatives_1;
		kc::unparse(as, kc_printer, kc_current_view);
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const alternative a = this->alternative_1;
		const alternatives ralts = this->alternatives_1;
		kc::unparse(ralts, kc_printer, kc_current_view);
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    if ((this->alternative_1->prod_sel() == sel_Alternative)) {
		const alternative alt = this->alternative_1;
		const ID id = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->ID_1;
		const arguments args = phylum_cast<const impl_alternative_Alternative*>(this->alternative_1)->arguments_1;
		const alternatives ralts = this->alternatives_1;
		kc::unparse(ralts, kc_printer, kc_current_view);
		kc::unparse(args, kc_printer, kc_current_view);
		v_resetcount();

	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (alternatives iterator_ = this; iterator_->alternatives_1 != 0; iterator_ = iterator_->alternatives_1)
		    iterator_->alternative_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_alternatives::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_attributes_enum: {
	    view_gen_operatormap_attributes_class& kc_current_view=static_cast<view_gen_operatormap_attributes_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatormap_c_enum: {
	    view_gen_operatormap_c_class& kc_current_view=static_cast<view_gen_operatormap_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_phylummap_c_enum: {
	    view_gen_phylummap_c_class& kc_current_view=static_cast<view_gen_phylummap_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_alternative_Alternative::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_classdefs_c_enum: {
	    view_gen_classdefs_c_class& kc_current_view=static_cast<view_gen_classdefs_c_class&>(kc_current_view_base);
	    {
		const alternative alt = this/**/;
		const ID oid = this->ID_1;
		const arguments args = this->arguments_1;
		gl_operator=oid;
		enum_operators kc_i = f_selofoperator(gl_operator);
		bool priorAssignments=false;
		if(kc_i!=sel_NoCaseStr && kc_i!=sel__Str) 
		{
		    if(!f_constructors_in_operatordecl(alt)) 
		    {
			kc::unparse(oid, kc_printer, view_class_of_op);
			{ kc_printer(kc_t("::"), kc_current_view); }
			kc::unparse(oid, kc_printer, view_class_of_op);
			{ kc_printer(kc_t("("), kc_current_view); }
			if (f_ispredefinedphylum(gl_phylum)) 
			{
			    kc::unparse(args, kc_printer, view_gen_fnarg_and_decls_predef);
			}
			else 
			{
			    kc::unparse(args, kc_printer, view_gen_fnarg_and_decls);
			}
			{ kc_printer(kc_t(")\n\v"), kc_current_view); }
			if (f_ispredefinedphylum(gl_phylum)) {
			    PRINT(priorAssignments ? ", " : ": "); priorAssignments=true; 
			    kc::unparse(args, kc_printer, view_gen_assignments_predef_ini);
			} else if (args->length()>0) {
			    PRINT(priorAssignments ? ", " : ": "); priorAssignments=true; 
			    kc::unparse(args, kc_printer, view_gen_assignment_inis);
			} 
			kc::unparse(additional_members, kc_printer, view_count_nonstaticmembers);
			if (gl_no_of_args) 
			{
			    PRINT(priorAssignments ? ", " : ": "); 
			    kc::unparse(gl_members, kc_printer, view_gen_user_assignment_inis);
			}
			{ kc_printer(kc_t(" { }\r\n"), kc_current_view); }
		    }
		}
	    }
	    break;
	}
	case view_gen_classdecls2_h_enum: {
	    view_gen_classdecls2_h_class& kc_current_view=static_cast<view_gen_classdecls2_h_class&>(kc_current_view_base);
	    {
		const alternative alt = this/**/;
		const ID oid = this->ID_1;
		const arguments args = this->arguments_1;
		ID id = f_phylumofoperator(oid);
		gl_operator = oid; 
			{ kc_printer(kc_t("class "), kc_current_view); }
		if(g_options.dllexports!="") {
		    PRINT(g_options.dllexports.c_str());
		    PRINT(" ");
		} 
			{ kc_printer(kc_t("impl_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(":"), kc_current_view); }

		{
		    baseclass_list kc_selvar_0_1 = phylum_cast<baseclass_list>(alt->base_classes);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consbaseclass_list)) {

			UNPARSE(alt->base_classes);

		    } else
		    {

			if (f_ispredefinedphylum(id)) {
			    PRINT("public impl_abstract_phylum");
			} else {
			    PRINT("public impl_"); UNPARSE(id);
			}

		    }
		}

		{ kc_printer(kc_t("{\
\n\rpublic:\v\
\n    enum_operators prod_sel() const\
\n    \v{ return sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("; }\r\
\n"), kc_current_view); }
		if (f_ispredefinedphylum(id)) 
		{
		    { kc_printer(kc_t("   static const enum_phyla phylum_sel_;\n"), kc_current_view); }
		}
		enum_operators kc_i = f_selofoperator(gl_operator);
		if(kc_i!=sel_NoCaseStr && kc_i!=sel__Str) 
		{
		    if(!f_constructors_in_operatordecl(alt)) 
		    {
			{ kc_printer(kc_t("explicit impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(oid, kc_printer, kc_current_view);
			{ kc_printer(kc_t("("), kc_current_view); }
			if (f_ispredefinedphylum(id)) 
			{
			    kc::unparse(args, kc_printer, view_gen_fnarg_and_decls_predef);
			}
			else 
			{
			    kc::unparse(args, kc_printer, view_gen_operatordecls_h);
			}
			{ kc_printer(kc_t(");\
\n	"), kc_current_view); }
		    }
		}
		else 
		{
		    { kc_printer(kc_t("\rprivate:\v\
\n	explicit impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t("(const kc_char_t*);\
\n	void make_own(int length);\
\n	friend "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" mk"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("(const kc_char_t*, int);\
\n\rpublic:\v\
\n	~impl_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		    { kc_printer(kc_t("() {\
\n	#if defined (_MSC_VER) && _MSC_VER<1300\
\n	    delete [] (kc_char_t*)name;\
\n	#else\
\n	    delete [] name;\
\n	#endif\
\n	}\
\n"), kc_current_view); }
		}
		if(args->length()!=0) 
		{
		    { kc_printer(kc_t("       abstract_phylum subphylum(int) const;\
\n	void set_subphylum(int, abstract_phylum);\
\n"), kc_current_view); }
		}
		if (!g_options.no_printdot && f_ispredefinedphylum(id)) 
		{
		    { kc_printer(kc_t("void fprintdot( FILE*, const char*, const char*, const char*, bool, bool, bool ) const;\n"), kc_current_view); }
		}
		if (!g_options.no_rewrite) 
		{
		    if (!g_options.rw_loop) 
		    {
			if (!f_ispredefinedphylum(id)) {
			    if(!f_rewrite_in_operatordecl(alt)) 
			    covariant_choice(id, " rewrite( rview );", "abstract_phylum rewrite( rview );",
				kc_printer, kc_current_view);
			    else
			    covariant_choice(id, " do_rewrite( rview );", "abstract_phylum do_rewrite( rview );",
				kc_printer, kc_current_view);
			}
			else 
			{
			    covariant_choice(id, " rewrite( rview )", "abstract_phylum rewrite( rview )",
				kc_printer, kc_current_view); 
			    	{ kc_printer(kc_t("\n\v{ return this; }\r"), kc_current_view); }
			}
		    }
		    else 
		    {
			if (!f_ispredefinedphylum(id)) 
			{
			    { kc_printer(kc_t("abstract_phylum do_rewrite( rview );"), kc_current_view); }
			}
		    }
		}
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if (g_options.smart_pointer) 
		{
		    if(f_ispredefinedphylum(id)) 
		    {
			{ kc_printer(kc_t("abstract_phylum_ref* new_phylum_ref() {\
\n        return new phylum_ref<impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(oid, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">(this);\
\n    }\
\n    impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("& operator=(const impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("& p) {\
\n	phylum_ref<impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">* my_ref=static_cast<phylum_ref<impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">*>(get_ref());\
\n	"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" self=this;\
\n	if(my_ref) {\
\n	    abstract_phylum_ref* ref=p.get_ref();\
\n	    self=const_cast<"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">(&p);\
\n	    if(ref)\
\n		self=phylum_cast<"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">(self->copy(true));\
\n	    my_ref->set_phylum(self);\
\n	}\
\n	return *self;\
\n    }\
\n"), kc_current_view); }
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t("& operator=(const phylum_ref<"), kc_current_view); }
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t(">& r) {\
\n	phylum_ref<"), kc_current_view); }
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t(">* my_ref=static_cast<phylum_ref<"), kc_current_view); }
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t(">*>(get_ref());\
\n	"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" self=this;\
\n	if(my_ref) {\
\n	    self=phylum_cast<"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">(r.get_phylum()?r.get_phylum()->copy(true):0);\
\n	    my_ref->set_phylum(self);\
\n	}\
\n	return *self;\
\n    }\
\n    "), kc_current_view); }
		    }
		    else 
		    {
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t("& operator=(const impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("& p) {\
\n	return "), kc_current_view); }
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t("::operator=(p);\
\n    }\
\n    impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t("& operator=(const phylum_ref<impl_"), kc_current_view); }
			kc::unparse(id, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">& r) {\
\n	return "), kc_current_view); }
			kc::unparse(id, kc_printer, view_class_of_phy);
			{ kc_printer(kc_t("::operator=(r);\
\n    }\
\n    "), kc_current_view); }
		    }
		    kc::unparse(oid, kc_printer, view_class_of_op);
		    { kc_printer(kc_t("* return_ptr() { if(get_ref()) get_ref()->lock(); return this; }\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const arguments args = this->arguments_1;
		{ kc_printer(kc_t("	{\
\n"), kc_current_view); }
		kc::unparse(args, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	}\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
		const ID oid = this->ID_1;
		unparseviewsinfo a_unparseviewsinfo = f_unparseviewsinfo_of_alternative( this, Theuviewnames );
		gl_phylum = f_phylumofoperator(oid);
		gl_operator = oid;
		gl_unparse_goto_used = false; 
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("void\
\nimpl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::do_unparse(printer_functor kc_printer, uview kc_current_view_base)\
\n{\
\n    switch(kc_current_view_base) {\
\n"), kc_current_view); }
		kc::unparse(a_unparseviewsinfo, kc_printer, view_gen_unparsedefs_c);
		{ kc_printer(kc_t("	}\
\n}\
\n\
\n"), kc_current_view); }
		freespineandelements(a_unparseviewsinfo);
		gl_phylum = 0;

	    }
	    break;
	}
	case view_gen_rewritedefs_body_c_enum: {
	    view_gen_rewritedefs_body_c_class& kc_current_view=static_cast<view_gen_rewritedefs_body_c_class&>(kc_current_view_base);
	    {
		const alternative alt = this/**/;
		const ID oid = this->ID_1;
		const arguments args = this->arguments_1;
		rewriteviewsinfo a_rewriteviewsinfo = f_rewriteviewsinfo_of_alternative( alt, Therviewnames );

		gl_operator = oid;
		gl_alternative = alt;
		gl_rewrite_goto_used = false;
		args->unparse(kc_printer, view_gen_rewritedefs_rewritearg_c);


		bool empty=true;
		{
		    rewriteviewsinfo kc_fe_selvar_1 =  a_rewriteviewsinfo;

		    while(
			    kc_fe_selvar_1->prod_sel() == sel_Consrewriteviewsinfo
			) {
			rewriteviewinfo kc_selvar_0_1 = kc_fe_selvar_1->rewriteviewinfo_1;
			{
			    {
				{
				    const rewriteviewinfo rvi = kc_selvar_0_1;
				    {
					rewriteviewinfo kc_selvar_1_1 = phylum_cast<rewriteviewinfo>(rvi);
					if ((kc_selvar_1_1->prod_sel() == sel_Rewriteviewinfo) && (phylum_cast<const impl_rewriteviewinfo_Rewriteviewinfo*>(kc_selvar_1_1)->rewriterulesinfo_1->prod_sel() == sel_Nilrewriterulesinfo)) {

					} else
					{
					    empty=false; 
					}
				    }

				}
			    }

			}
			kc_fe_selvar_1 = kc_fe_selvar_1->rewriteviewsinfo_1;

		    }
		}
		if(!empty) {
		    PRINT("    switch(kc_current_view_base) {\n");
		    a_rewriteviewsinfo->unparse(kc_printer, view_gen_rewritedefs_c);
		    PRINT("    }\n");
		}

		kc::unparse(args, kc_printer, view_gen_rewritedefs_testarg_c);
		freespineandelements(a_rewriteviewsinfo);
		gl_operator = 0;
		gl_alternative = 0; 
	    }
	    break;
	}
	case view_gen_rewritedefs_other_c_enum: {
	    view_gen_rewritedefs_other_c_class& kc_current_view=static_cast<view_gen_rewritedefs_other_c_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const arguments args = this->arguments_1;
		if (! gl_rewrite_rewriteinfo->eq( Nilrewriterulesinfo())) 
		{
		    gl_args=args; 
		    kc::unparse(gl_rewrite_rewriteinfo, kc_printer, kc_current_view);
		    gl_args = 0; 
		     }
	    }
	    break;
	}
	case view_gen_rewritedefs_default_c_enum: {
	    view_gen_rewritedefs_default_c_class& kc_current_view=static_cast<view_gen_rewritedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const arguments args = this->arguments_1;
		gl_args=args; 
		kc::unparse(gl_rewrite_rewriteinfo, kc_printer, kc_current_view);
		gl_args = 0; 
	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
		const alternative alt = this/**/;
		const ID oid = this->ID_1;
		const arguments args = this->arguments_1;
		gl_phylum = f_phylumofoperator(oid); 
		 if(!g_options.rw_loop) 
		{
		    covariant_choice(gl_phylum, "", "abstract_phylum", kc_printer, kc_current_view); 
		     }
		else 
		{
		    { kc_printer(kc_t("abstract_phylum"), kc_current_view); }
		}
		{ kc_printer(kc_t(" impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::"), kc_current_view); }
		if(f_rewrite_in_operatordecl(alt) || g_options.rw_loop) 
		{
		    { kc_printer(kc_t("do_"), kc_current_view); }
		}
		{ kc_printer(kc_t("rewrite(rview kc_current_view_base)\
\n{\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_rewritedefs_body_c);
		{ kc_printer(kc_t("\
\n}\
\n"), kc_current_view); }
		gl_phylum = 0; 
	    }
	    break;
	}
	case view_gen_listdecls_h_enum: {
	    view_gen_listdecls_h_class& kc_current_view=static_cast<view_gen_listdecls_h_class&>(kc_current_view_base);
	    {
		const ID oid = this->ID_1;
		ID id = f_phylumofoperator(oid);
		ID el = f_listelementphylum(id);

		if (!el->eq(f_emptyId())) { 
		    	{ kc_printer(kc_t("// TODO: Is this code ever generated?\n"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" map("), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" (*)("), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("));\n"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" filter( bool (*)("), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("));\n"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" merge( "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(", "), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" (*)("), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(", "), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("));\n"), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" reduce( "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" neutral, "), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" (*)("), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t(", "), kc_current_view); }
		    kc::unparse(el, kc_printer, kc_current_view);
		    { kc_printer(kc_t("));\n"), kc_current_view); }
		} 
	    }
	    break;
	}
	case view_gen_nodetypes_h_enum: {
	    view_gen_nodetypes_h_class& kc_current_view=static_cast<view_gen_nodetypes_h_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID oid = this->ID_1;
		if (f_ispredefinedphylum(f_phylumofoperator(oid))) {
		    enum_operators kc_i = f_selofoperator(oid); 
		    	{ kc_printer(kc_t("    "), kc_current_view); }
		    PRINT(preDefTypeAndName[kc_i][0]); 
		    	{ kc_printer(kc_t(" "), kc_current_view); }
		    PRINT(preDefTypeAndName[kc_i][1]); 
		    	{ kc_printer(kc_t(";\
\n"), kc_current_view); }
		} else 
		{
		}
	    } else
	    {
		const ID oid = this->ID_1;
		const arguments args = this->arguments_1;
		kc::unparse(args, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_enumoperators_h_enum: {
	    view_gen_enumoperators_h_class& kc_current_view=static_cast<view_gen_enumoperators_h_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("    sel_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = "), kc_current_view); }
		kc::unparse(g_no_of_operators, kc_printer, kc_current_view);
		{ kc_printer(kc_t(",\
\n"), kc_current_view); }
		g_no_of_operators++; 
	    }
	    break;
	}
	case view_gen_deprecated_enum: {
	    view_gen_deprecated_class& kc_current_view=static_cast<view_gen_deprecated_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("#define kc_tag_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const arguments args = this->arguments_1;
		kc::unparse(args, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		kc::unparse(additional_members, kc_printer, view_count_attrs);
		if (gl_no_of_args) 
		{
		    { kc_printer(kc_t("void kc_initialize_"), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t("()\
\n	    {\n"), kc_current_view); }
		    { kc_printer(kc_t("}\n"), kc_current_view); }
		}
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_arguments::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_argseqnr_rec_enum: {
	    view_gen_argseqnr_rec_class& kc_current_view=static_cast<view_gen_argseqnr_rec_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    } else
	    {
		const ID a = this->ID_1;
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", _"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_set_subphylumdefs_c_enum: {
	    view_gen_set_subphylumdefs_c_class& kc_current_view=static_cast<view_gen_set_subphylumdefs_c_class&>(kc_current_view_base);
	    {
		const ID a = this->ID_1;
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t("case "), kc_current_view); }
		kc::unparse(gl_no_of_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": newval = "), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = dynamic_cast<"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(val);break;\n"), kc_current_view); }
		gl_no_of_args++; 
	    }
	    break;
	}
	case view_gen_subphylumdefs_c_enum: {
	    view_gen_subphylumdefs_c_class& kc_current_view=static_cast<view_gen_subphylumdefs_c_class&>(kc_current_view_base);
	    {
		const ID a = this->ID_1;
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t("case "), kc_current_view); }
		kc::unparse(gl_no_of_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": return "), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\n"), kc_current_view); }
		gl_no_of_args++; 
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Consarguments) && ((this->arguments_1)->arguments_1->prod_sel() == sel_Nilarguments) && (KC_TRACE_PROVIDED((kc_current_view.isList && kc_current_view.isOnlyDefault), "gen.k", 7409, this))) {
		const ID tail = this->ID_1;
		const ID head = (this->arguments_1)->ID_1;
		{ kc_printer(kc_t("	    for ("), kc_current_view); }
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" iterator_ = this; iterator_->"), kc_current_view); }
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1 != 0; iterator_ = iterator_->"), kc_current_view); }
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1)\
\n		\viterator_->"), kc_current_view); }
		kc::unparse(head, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1->unparse(kc_printer, kc_current_view);\r\
\n"), kc_current_view); }
	    } else
		if ((KC_TRACE_PROVIDED((kc_current_view.isList && !kc_current_view.isOnlyDefault), "gen.k", 7418, this))) {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	    "), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		if (a->eq(f_phylumofoperator(gl_operator)) &&
		    kc_current_view.isList) 
		{
		    { kc_printer(kc_t("do_"), kc_current_view); }
		}
		{ kc_printer(kc_t("unparse(kc_printer, kc_current_view );\
\n"), kc_current_view); }
	    } else
	    {
		{ kc_printer(kc_t("default_unparse(kc_printer, kc_current_view );\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedefs_args_c_enum: {
	    view_gen_rewritedefs_args_c_class& kc_current_view=static_cast<view_gen_rewritedefs_args_c_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a_arg = this->ID_1;
		if (!g_options.rw_loop) 
		{
		    { kc_printer(kc_t("l_"), kc_current_view); }
		}
		kc::unparse(a_arg, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    } else
	    {
		const ID a_arg = this->ID_1;
		const arguments r_args = this->arguments_1;
		kc::unparse(r_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		if (!g_options.rw_loop) 
		{
		    { kc_printer(kc_t("l_"), kc_current_view); }
		}
		kc::unparse(a_arg, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_rewritedefs_dotestarg_c_enum: {
	    view_gen_rewritedefs_dotestarg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_dotestarg_c_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a_arg = this->ID_1;
		{ kc_printer(kc_t("l_"), kc_current_view); }
		kc::unparse(a_arg, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" == "), kc_current_view); }
		kc::unparse(a_arg, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    } else
	    {
		const ID a_arg = this->ID_1;
		const arguments r_args = this->arguments_1;
		kc::unparse(r_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") &&  (l_"), kc_current_view); }
		kc::unparse(a_arg, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" == "), kc_current_view); }
		kc::unparse(a_arg, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_rewritedefs_testarg_c_enum: {
	    view_gen_rewritedefs_testarg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_testarg_c_class&>(kc_current_view_base);
	    {
		gl_phylum = f_phylumofoperator(gl_operator); 
		 if(!g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	if (("), kc_current_view); }
		    kc::unparse(this, kc_printer, view_gen_rewritedefs_dotestarg_c);
		    { kc_printer(kc_t("))\
\n	    return this;\
\n	else {\
\n	    impl_"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    if(f_listelementphylum(gl_phylum)->eq(f_emptyId()))
		    {
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(gl_operator, kc_printer, kc_current_view);
		    }
		    { kc_printer(kc_t("* kc_result= "), kc_current_view); }
		    kc::unparse(gl_operator, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(this, kc_printer, view_gen_rewritedefs_args_c);
		    { kc_printer(kc_t(");\
\n	    kc_result->rewrite_members(this);\
\n	    return kc_result;\
\n	}"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("	return this;"), kc_current_view); }
		}
		gl_phylum = 0; 
	    }
	    break;
	}
	case view_gen_rewritedefs_nl_arg_c_enum: {
	    view_gen_rewritedefs_nl_arg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_nl_arg_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("	"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_rp = (("), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_rewritedefs_dotestarg_c);
		{ kc_printer(kc_t("))\
\n	    ? this\
\n	    : "), kc_current_view); }
		kc::unparse(gl_operator, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_rewritedefs_args_c);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedefs_rewritearg_c_enum: {
	    view_gen_rewritedefs_rewritearg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_rewritearg_c_class&>(kc_current_view_base);
	    {
		const ID a_arg = this->ID_1;
		const arguments r_args = this->arguments_1;
		kc::unparse(r_args, kc_printer, kc_current_view);
		if (!g_options.rw_loop) 
		{
		    if(g_options.smart_pointer) 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_ptr l_"), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(this->seqnr, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" ="), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" l_"), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(this->seqnr, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" ="), kc_current_view); }
		    }
		    { kc_printer(kc_t("\n"), kc_current_view); }
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#ifndef NO_COVARIANT_RETURN\n"), kc_current_view); }
		    }
		    if (g_options.covariant!='n') 
		    {
			{ kc_printer(kc_t("\v"), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(this->seqnr, kc_printer, kc_current_view);
			{ kc_printer(kc_t("->rewrite(kc_current_view_base);\r\n"), kc_current_view); }
		    }
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#else\n"), kc_current_view); }
		    }
		    if (g_options.covariant!='y') 
		    {
			{ kc_printer(kc_t("\vstatic_cast<"), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t(">("), kc_current_view); }
			kc::unparse(a_arg, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_"), kc_current_view); }
			kc::unparse(this->seqnr, kc_printer, kc_current_view);
			{ kc_printer(kc_t("->rewrite(kc_current_view_base));\r\n"), kc_current_view); }
		    }
		    if (g_options.covariant=='p') 
		    {
			{ kc_printer(kc_t("#endif // NO_COVARIANT_RETURN\n"), kc_current_view); }
		    }
		}
	    }
	    break;
	}
	case view_gen_test_enum: {
	    view_gen_test_class& kc_current_view=static_cast<view_gen_test_class&>(kc_current_view_base);
	    {
		const arguments rargs = this->arguments_1;
		bool isnotlist=f_listelementphylum(gl_phylum)->eq(f_emptyId()); 
		kc::unparse(rargs, kc_printer, kc_current_view);
		if(isnotlist)
		{
		    { kc_printer(kc_t(" && (dynamic_cast<impl_"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(gl_operator, kc_printer, kc_current_view);
		    { kc_printer(kc_t("*>(kc_x)->"), kc_current_view); }
		}
		else
		{
		    { kc_printer(kc_t(" && (kc_x->"), kc_current_view); }
		}
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(" == _"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_assignment_inis_enum: {
	    view_gen_assignment_inis_class& kc_current_view=static_cast<view_gen_assignment_inis_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t("(_"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(")"), kc_current_view); }
		if (a->named_subphylum) 
		{
		    { kc_printer(kc_t(", "), kc_current_view); }
		    kc::unparse(a->named_subphylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(this, kc_printer, view_gen_argseqnr);
		    { kc_printer(kc_t(")"), kc_current_view); }
		}
	    } else
	    {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t("(_"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(")"), kc_current_view); }
		if (a->named_subphylum) 
		{
		    { kc_printer(kc_t(", "), kc_current_view); }
		    kc::unparse(a->named_subphylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(this, kc_printer, view_gen_argseqnr);
		    { kc_printer(kc_t(")"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_assignments_enum: {
	    view_gen_assignments_class& kc_current_view=static_cast<view_gen_assignments_class&>(kc_current_view_base);
	    {
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(" = _"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnarg_and_decls_enum: {
	    view_gen_fnarg_and_decls_class& kc_current_view=static_cast<view_gen_fnarg_and_decls_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" _"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
	    } else
	    {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" _"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
	    }
	    break;
	}
	case view_gen_fnarg_asserts_enum: {
	    view_gen_fnarg_asserts_class& kc_current_view=static_cast<view_gen_fnarg_asserts_class&>(kc_current_view_base);
	    {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		{ kc_printer(kc_t("assertPhylum(_"), kc_current_view); }
		kc::unparse(this, kc_printer, view_gen_argseqnr);
		{ kc_printer(kc_t(", phylum_"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_argseqnr_enum: {
	    view_gen_argseqnr_class& kc_current_view=static_cast<view_gen_argseqnr_class&>(kc_current_view_base);
	    {
		const ID a = this->ID_1;
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    {
		const ID a = this->ID_1;
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		ID ident;
		ac_identifier_list idents = gl_idents;
		for (int i=gl_idents->length(); i>gl_no_of_args; --i) {
		    {
			ac_identifier_list kc_selvar_0_1 = phylum_cast<ac_identifier_list>(idents);
			if ((kc_selvar_0_1->prod_sel() == sel_Consac_identifier_list)) {
			    const ID i = (kc_selvar_0_1)->ID_1;
			    const ac_identifier_list ri = (kc_selvar_0_1)->ac_identifier_list_1;
			    ident=i; idents=ri; 
			    	} else
			    kc_no_default_in_with( "", __LINE__, __FILE__ );
		    }
		}

		{ kc_printer(kc_t("case "), kc_current_view); }
		kc::unparse(gl_no_of_args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": return reinterpret_cast<abstract_phylum&>(phylum_cast<"), kc_current_view); }
		kc::unparse(gl_operator, kc_printer, view_class_of_op);
		{ kc_printer(kc_t("*>(kc_p)->"), kc_current_view); }
		kc::unparse(ident, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\n"), kc_current_view); }
		++gl_no_of_args; 
	    }
	    break;
	}
	case view_gen_create_function_enum: {
	    view_gen_create_function_class& kc_current_view=static_cast<view_gen_create_function_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		{ kc_printer(kc_t("phylum_cast<"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p1)"), kc_current_view); }
		gl_generic_counter=2; 
			} else
	    {
		const ID a = this->ID_1;
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		{ kc_printer(kc_t("phylum_cast<"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">(kc_p"), kc_current_view); }
		kc::unparse(gl_generic_counter, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
		++gl_generic_counter; 
	    }
	    break;
	}
	case view_gen_operatorcast_h_enum: {
	    view_gen_operatorcast_h_class& kc_current_view=static_cast<view_gen_operatorcast_h_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
	    {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
	    {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_nodetypes_h_enum: {
	    view_gen_nodetypes_h_class& kc_current_view=static_cast<view_gen_nodetypes_h_class&>(kc_current_view_base);
	    {
		const ID a = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		if(g_options.smart_pointer) 
		{
		    kc::unparse(a, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_ptr "), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("	    impl_"), kc_current_view); }
		    kc::unparse(a, kc_printer, kc_current_view);
		    { kc_printer(kc_t("* "), kc_current_view); }
		}
		kc::unparse(a, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(this->seqnr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\n"), kc_current_view); }
		if (a->named_subphylum) 
		{
		    if(g_options.smart_pointer) 
		    {
			kc::unparse(a, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_ptr& "), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	    impl_"), kc_current_view); }
			kc::unparse(a, kc_printer, kc_current_view);
			{ kc_printer(kc_t("*& "), kc_current_view); }
		    }
		    kc::unparse(a->named_subphylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" /* = "), kc_current_view); }
		    kc::unparse(a, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(this->seqnr, kc_printer, kc_current_view);
		    { kc_printer(kc_t("*/;\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    if ((this->arguments_1->prod_sel() == sel_Nilarguments)) {
		const ID a = this->ID_1;
		{ kc_printer(kc_t("phylum_"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
	    } else
	    {
		const ID a = this->ID_1;
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		{ kc_printer(kc_t("phylum_"), kc_current_view); }
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_count_args_enum: {
	    view_count_args_class& kc_current_view=static_cast<view_count_args_class&>(kc_current_view_base);
	    {
		const arguments ra = this->arguments_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		gl_no_of_args++; 
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const arguments rargs = this->arguments_1;
		phylumdeclaration tmp = f_lookupdecl( id ); 
		kc::unparse(rargs, kc_printer, kc_current_view);
		if (tmp) 
		{
		    kc::unparse(tmp, kc_printer, view_check_uniq2);
		}
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const arguments rargs = this->arguments_1;
		kc::unparse(rargs, kc_printer, kc_current_view);
		f_useoccurphylum( id );
		this->seqnr = f_getcount( id );

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (arguments iterator_ = this; iterator_->arguments_1 != 0; iterator_ = iterator_->arguments_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_arguments::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_rewritedefs_args_c_enum: {
	    view_gen_rewritedefs_args_c_class& kc_current_view=static_cast<view_gen_rewritedefs_args_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_rewritedefs_dotestarg_c_enum: {
	    view_gen_rewritedefs_dotestarg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_dotestarg_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_rewritedefs_testarg_c_enum: {
	    view_gen_rewritedefs_testarg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_testarg_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("	return this;\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedefs_nl_arg_c_enum: {
	    view_gen_rewritedefs_nl_arg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_nl_arg_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("	"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_rp = this;\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedefs_rewritearg_c_enum: {
	    view_gen_rewritedefs_rewritearg_c_class& kc_current_view=static_cast<view_gen_rewritedefs_rewritearg_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_test_enum: {
	    view_gen_test_class& kc_current_view=static_cast<view_gen_test_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_assignments_predef_ini_enum: {
	    view_gen_assignments_predef_ini_class& kc_current_view=static_cast<view_gen_assignments_predef_ini_class&>(kc_current_view_base);
	    {
		enum_operators kc_i = f_selofoperator(gl_operator);
		PRINT(preDefTypeAndName[kc_i][1]); 
			{ kc_printer(kc_t("(_"), kc_current_view); }
		PRINT(preDefTypeAndName[kc_i][1]); 
			{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_assignments_predef_enum: {
	    view_gen_assignments_predef_class& kc_current_view=static_cast<view_gen_assignments_predef_class&>(kc_current_view_base);
	    {
		enum_operators kc_i = f_selofoperator(gl_operator);
		PRINT(preDefTypeAndName[kc_i][1]); 
			{ kc_printer(kc_t(" = _"), kc_current_view); }
		PRINT(preDefTypeAndName[kc_i][1]); 
			{ kc_printer(kc_t(";\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_assignments_enum: {
	    view_gen_assignments_class& kc_current_view=static_cast<view_gen_assignments_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_fnarg_and_decls_predef_enum: {
	    view_gen_fnarg_and_decls_predef_class& kc_current_view=static_cast<view_gen_fnarg_and_decls_predef_class&>(kc_current_view_base);
	    {
		enum_operators kc_i = f_selofoperator(gl_operator); 
		 PRINT(preDefTypeAndName[kc_i][0]); 
			{ kc_printer(kc_t(" _"), kc_current_view); }
		PRINT(preDefTypeAndName[kc_i][1]); 
	    }
	    break;
	}
	case view_gen_fnarg_and_decls_enum: {
	    view_gen_fnarg_and_decls_class& kc_current_view=static_cast<view_gen_fnarg_and_decls_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_fnarg_asserts_enum: {
	    view_gen_fnarg_asserts_class& kc_current_view=static_cast<view_gen_fnarg_asserts_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_attributeOf_function_enum: {
	    view_gen_attributeOf_function_class& kc_current_view=static_cast<view_gen_attributeOf_function_class&>(kc_current_view_base);
	    {
		gl_no_of_args=0;
	    }
	    break;
	}
	case view_gen_operatormap_subphyla_enum: {
	    view_gen_operatormap_subphyla_class& kc_current_view=static_cast<view_gen_operatormap_subphyla_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_count_args_enum: {
	    view_count_args_class& kc_current_view=static_cast<view_count_args_class&>(kc_current_view_base);
	    {
		gl_no_of_args = 0; 
	    }
	    break;
	}
	case view_check_uniq1_enum: {
	    view_check_uniq1_class& kc_current_view=static_cast<view_check_uniq1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_count1_enum: {
	    view_check_count1_class& kc_current_view=static_cast<view_check_count1_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_argument_Argument::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ID id = this->ID_1;
		const integer i = this->integer_1;
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_Ccode_option_CcodeOption::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_nodetypes_h_enum: {
	    view_gen_nodetypes_h_class& kc_current_view=static_cast<view_gen_nodetypes_h_class&>(kc_current_view_base);
	    {
		const attributes a = this->attributes_1;
		kc::unparse(a, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const attributes attr = this->attributes_1;
		const Ctexts init = this->Ctexts_1;
		kc::unparse(attr, kc_printer, kc_current_view);
		kc::unparse(init, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const Ctexts ct = this->Ctexts_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_attributes::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_copy_attributes_c_enum: {
	    view_gen_copy_attributes_c_class& kc_current_view=static_cast<view_gen_copy_attributes_c_class&>(kc_current_view_base);
	    if ((this->attribute_1->prod_sel() == sel_Attribute)) {
		const ID aid = phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->ID_2;
		const attributes ra = this->attributes_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    p2->"), kc_current_view); }
		kc::unparse(aid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = p1->"), kc_current_view); }
		kc::unparse(aid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_nodetypes_h_enum: {
	    view_gen_nodetypes_h_class& kc_current_view=static_cast<view_gen_nodetypes_h_class&>(kc_current_view_base);
	    if ((this->attribute_1->prod_sel() == sel_Attribute)) {
		const ID t = phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->ID_1;
		const ID id = phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->ID_2;
		const attributes ra = this->attributes_1;
		kc::unparse(ra, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    "), kc_current_view); }
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    if ((this->attribute_1->prod_sel() == sel_Attribute) && (phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->attribute_initialisation_option_1->prod_sel() == sel_Yesattribute_initialisation)) {
		const ID aid = phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->ID_2;
		const Cexpression cexpr = phylum_cast<const impl_attribute_initialisation_option_Yesattribute_initialisation*>(phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->attribute_initialisation_option_1)->Cexpression_1;
		const attributes ra = this->attributes_1;
		ID selvar; 
		kc::unparse(ra, kc_printer, kc_current_view);
		selvar = Id(Str(mkcasestring("kc_x")));
		selvar->line = aid->line; 
		selvar->file = aid->file;

		dollarvarstack.push( selvar );
		dollarvarextstack.push( f_emptyId() );
		operatorstack.push( f_emptyId() );

		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(aid->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(aid->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    kc_x->"), kc_current_view); }
		kc::unparse(aid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = "), kc_current_view); }
		kc::unparse(cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }

		dollarvarstack.pop();
		dollarvarextstack.pop();
		operatorstack.pop();

	    } else
		if ((this->attribute_1->prod_sel() == sel_Attribute) && (phylum_cast<const impl_attribute_Attribute*>(this->attribute_1)->attribute_initialisation_option_1->prod_sel() == sel_Noattribute_initialisation)) {
		const attributes ra = this->attributes_1;
		kc::unparse(ra, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (attributes iterator_ = this; iterator_->attributes_1 != 0; iterator_ = iterator_->attributes_1)
		    iterator_->attribute_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_attributes::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_copy_attributes_c_enum: {
	    view_gen_copy_attributes_c_class& kc_current_view=static_cast<view_gen_copy_attributes_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_nodetypes_h_enum: {
	    view_gen_nodetypes_h_class& kc_current_view=static_cast<view_gen_nodetypes_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_attribute_Attribute::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_attribute_initialisation_option_Yesattribute_initialisation::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_attribute_initialisation_option_Noattribute_initialisation::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_Cexpression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		const Cexpression_elem ce = this->Cexpression_elem_1;
		const Cexpression ces = this->Cexpression_1;
		kc::unparse(ces, kc_printer, kc_current_view);
		kc::unparse(ce, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Cexpression_elem ce = this->Cexpression_elem_1;
		const Cexpression ces = this->Cexpression_1;
		kc::unparse(ces, kc_printer, kc_current_view);
		kc::unparse(ce, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const Cexpression_elem h = this->Cexpression_elem_1;
		const Cexpression t = this->Cexpression_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (Cexpression iterator_ = this; iterator_->Cexpression_1 != 0; iterator_ = iterator_->Cexpression_1)
		    iterator_->Cexpression_elem_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_Cexpression::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionArray::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		const Cexpression cexpr = this->Cexpression_1;
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Cexpression cexpr = this->Cexpression_1;
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const Cexpression ce = this->Cexpression_1;
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(ce, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionPack::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		const Cexpression cexpr = this->Cexpression_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Cexpression cexpr = this->Cexpression_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const Cexpression ce = this->Cexpression_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ce, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionSQ::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		const CexpressionSQ cesq = this->CexpressionSQ_1;
		{ kc_printer(kc_t("'"), kc_current_view); }
		kc::unparse(cesq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("'"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const CexpressionSQ cesq = this->CexpressionSQ_1;
		{ kc_printer(kc_t("'"), kc_current_view); }
		kc::unparse(cesq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("'"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const CexpressionSQ cesq = this->CexpressionSQ_1;
		{ kc_printer(kc_t("'"), kc_current_view); }
		kc::unparse(cesq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("'"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionDQ::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		{ kc_printer(kc_t("\""), kc_current_view); }
		kc::unparse(cedq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		{ kc_printer(kc_t("\""), kc_current_view); }
		kc::unparse(cedq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		{ kc_printer(kc_t("\""), kc_current_view); }
		kc::unparse(cedq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionNl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t(" "), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionDollarvar::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		ID oid = f_emptyId(), dollarvar = dollarvarstack.top(), dollarvarext = dollarvarextstack.top();
		argument arg;
		bool nulvar = true;
		{
		    INT kc_selvar_0_1 = phylum_cast<INT>( i );
		    if ((kc_selvar_0_1->prod_sel() == sel_Int)) {
			const integer ii = phylum_cast<const impl_INT_Int*>(kc_selvar_0_1)->integer_1;

			if (ii->value != 0) {
			    nulvar = false;
			    oid = operatorstack.top();
			    arg = f_argumentofoperator( oid, i );
			}   
				} else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

		if (nulvar) 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		}
		else 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		    { kc_printer(kc_t("->"), kc_current_view); }
		    kc::unparse(arg, kc_printer, kc_current_view);
		    arg->free( false );  
		     }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		{ kc_printer(kc_t("$"), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Cexpression_elem_CExpressionPart::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_user_predicates_enum: {
	    view_gen_user_predicates_class& kc_current_view=static_cast<view_gen_user_predicates_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		std::map<string, path>::iterator p; char const *c=cs->name; std::string s;
#ifdef KIMWITUVERSIONMAJOR
#define kc_uviews uviews
#endif
		while (*c) {
		    s=f_getidentfromstring(&c);
		    p=gl_bindings.find(s);
		    if (p!=gl_bindings.end()) {
			path path_temp=p->second;
			{
			    path kc_selvar_0_1 = phylum_cast<path>(path_temp);
			    if ((kc_selvar_0_1->prod_sel() == sel_Conspath)) {
				const path r_p = (kc_selvar_0_1)->path_1;

				r_p->unparse(kc_printer, view_gen_cast);
				path_temp->unparse(kc_printer, *kc_uviews[gl_outer_view].view); 
					} else
				if ((kc_selvar_0_1->prod_sel() == sel_Nilpath)) {
				path_temp->unparse(kc_printer, *kc_uviews[gl_outer_view].view); 
					} else
				kc_no_default_in_with( "", __LINE__, __FILE__ );
			}
		    }
		    else {
			PRINT(s.c_str());
		    }
		} 
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s = this->casestring_1;
		kc::unparse(s, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_CexpressionDQ::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    {
		const CexpressionDQ_elem cedqe = this->CexpressionDQ_elem_1;
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		kc::unparse(cedq, kc_printer, kc_current_view);
		kc::unparse(cedqe, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unpstr_c_enum: {
	    view_gen_unpstr_c_class& kc_current_view=static_cast<view_gen_unpstr_c_class&>(kc_current_view_base);
	    {
		const CexpressionDQ_elem cedqe = this->CexpressionDQ_elem_1;
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		kc::unparse(cedq, kc_printer, kc_current_view);
		kc::unparse(cedqe, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const CexpressionDQ_elem cedqe = this->CexpressionDQ_elem_1;
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		kc::unparse(cedq, kc_printer, kc_current_view);
		kc::unparse(cedqe, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const CexpressionDQ_elem h = this->CexpressionDQ_elem_1;
		const CexpressionDQ t = this->CexpressionDQ_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (CexpressionDQ iterator_ = this; iterator_->CexpressionDQ_1 != 0; iterator_ = iterator_->CexpressionDQ_1)
		    iterator_->CexpressionDQ_elem_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_CexpressionDQ::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unpstr_c_enum: {
	    view_gen_unpstr_c_class& kc_current_view=static_cast<view_gen_unpstr_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_CexpressionDQ_elem_CExpressionDQNl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\\\n\\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unpstr_c_enum: {
	    view_gen_unpstr_c_class& kc_current_view=static_cast<view_gen_unpstr_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\\\n\\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t(" "), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_CexpressionDQ_elem_CExpressionDQPart::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unpstr_c_enum: {
	    view_gen_unpstr_c_class& kc_current_view=static_cast<view_gen_unpstr_c_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s = this->casestring_1;
		kc::unparse(s, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_CexpressionSQ::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const CexpressionSQ_elem cesqe = this->CexpressionSQ_elem_1;
		const CexpressionSQ cesq = this->CexpressionSQ_1;
		kc::unparse(cesq, kc_printer, kc_current_view);
		kc::unparse(cesqe, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const CexpressionSQ_elem h = this->CexpressionSQ_elem_1;
		const CexpressionSQ t = this->CexpressionSQ_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (CexpressionSQ iterator_ = this; iterator_->CexpressionSQ_1 != 0; iterator_ = iterator_->CexpressionSQ_1)
		    iterator_->CexpressionSQ_elem_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_CexpressionSQ::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_CexpressionSQ_elem_CExpressionSQNl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t(" "), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_CexpressionSQ_elem_CExpressionSQPart::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s = this->casestring_1;
		kc::unparse(s, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_idCexpressions::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_initializephyla_update_loop_c_enum: {
	    view_gen_initializephyla_update_loop_c_class& kc_current_view=static_cast<view_gen_initializephyla_update_loop_c_class&>(kc_current_view_base);
	    if ((this->idCexpression_1->prod_sel() == sel_IdCexpression)) {
		const ID tid = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->ID_1;
		const Cexpression cexpr = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->Cexpression_1;
		const idCexpressions t = this->idCexpressions_1;
		kc::unparse(t, kc_printer, kc_current_view);
		g_fe_selvar_nr++; 
			{ kc_printer(kc_t("kc_fe_selvar_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = kc_fe_selvar_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		kc::unparse(tid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1;\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(cexpr->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(cexpr->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_initializephyla_init_el_c_enum: {
	    view_gen_initializephyla_init_el_c_class& kc_current_view=static_cast<view_gen_initializephyla_init_el_c_class&>(kc_current_view_base);
	    if ((this->idCexpression_1->prod_sel() == sel_IdCexpression)) {
		const ID tid = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->ID_1;
		const idCexpressions t = this->idCexpressions_1;
		ID element_type = f_listelementphylum( tid );
		ID selvar = cf_topselvar();

		kc::unparse(t, kc_printer, kc_current_view);
		g_fe_selvar_nr++; 
		kc::unparse(element_type, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(selvar, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = kc_fe_selvar_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		kc::unparse(element_type, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_1;\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_initializephyla_whiletest_c_enum: {
	    view_gen_initializephyla_whiletest_c_class& kc_current_view=static_cast<view_gen_initializephyla_whiletest_c_class&>(kc_current_view_base);
	    if ((this->idCexpression_1->prod_sel() == sel_IdCexpression) && (this->idCexpressions_1->prod_sel() == sel_NilidCexpressions)) {
		const ID tid = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->ID_1;
		const idCexpressions t = this->idCexpressions_1;
		kc::unparse(t, kc_printer, kc_current_view);
		g_fe_selvar_nr++; 
			{ kc_printer(kc_t("    kc_fe_selvar_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->prod_sel() == sel_Cons"), kc_current_view); }
		kc::unparse(tid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
	    } else
		if ((this->idCexpression_1->prod_sel() == sel_IdCexpression)) {
		const ID tid = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->ID_1;
		const idCexpressions t = this->idCexpressions_1;
		kc::unparse(t, kc_printer, kc_current_view);
		g_fe_selvar_nr++; 
			{ kc_printer(kc_t("    && kc_fe_selvar_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->prod_sel() == sel_Cons"), kc_current_view); }
		kc::unparse(tid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    if ((this->idCexpression_1->prod_sel() == sel_IdCexpression)) {
		const ID tid = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->ID_1;
		const Cexpression cexpr = phylum_cast<const impl_idCexpression_IdCexpression*>(this->idCexpression_1)->Cexpression_1;
		const idCexpressions t = this->idCexpressions_1;
		kc::unparse(t, kc_printer, kc_current_view);
		g_fe_selvar_nr++; 
		   if (cexpr->line) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(cexpr->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(cexpr->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		}
		kc::unparse(tid, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_fe_selvar_"), kc_current_view); }
		kc::unparse(g_fe_selvar_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = "), kc_current_view); }
		kc::unparse(cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const idCexpression h = this->idCexpression_1;
		const idCexpressions t = this->idCexpressions_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (idCexpressions iterator_ = this; iterator_->idCexpressions_1 != 0; iterator_ = iterator_->idCexpressions_1)
		    iterator_->idCexpression_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_idCexpressions::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_update_loop_c_enum: {
	    view_gen_initializephyla_update_loop_c_class& kc_current_view=static_cast<view_gen_initializephyla_update_loop_c_class&>(kc_current_view_base);
	    {
		g_fe_selvar_nr = 0; 
	    }
	    break;
	}
	case view_gen_initializephyla_init_el_c_enum: {
	    view_gen_initializephyla_init_el_c_class& kc_current_view=static_cast<view_gen_initializephyla_init_el_c_class&>(kc_current_view_base);
	    {
		g_fe_selvar_nr = 0; 
	    }
	    break;
	}
	case view_gen_initializephyla_whiletest_c_enum: {
	    view_gen_initializephyla_whiletest_c_class& kc_current_view=static_cast<view_gen_initializephyla_whiletest_c_class&>(kc_current_view_base);
	    {
		g_fe_selvar_nr = 0; 
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		g_fe_selvar_nr = 0; 
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_idCexpression_IdCexpression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID t = this->ID_1;
		f_useoccurlistphylum( t ); 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_Ctexts::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		const Ctexts cts = this->Ctexts_1;
		ID selvar; 
		kc::unparse(cts, kc_printer, kc_current_view);
		selvar = Id(Str(mkcasestring("kc_x")));
		selvar->line = ct->line; 
		selvar->file = ct->file;

		dollarvarstack.push( selvar );
		dollarvarextstack.push( f_emptyId() );
		operatorstack.push( f_emptyId() );

		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, kc_current_view);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);

		dollarvarstack.pop();
		dollarvarextstack.pop();
		operatorstack.pop();

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (Ctexts iterator_ = this; iterator_->Ctexts_1 != 0; iterator_ = iterator_->Ctexts_1)
		    iterator_->Ctext_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_Ctexts::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_includefiles::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (includefiles iterator_ = this; iterator_->includefiles_1 != 0; iterator_ = iterator_->includefiles_1)
		    iterator_->includefile_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_includefiles::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_includefile_IncludeFile::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_includedeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_do_gen_includes_enum: {
	    view_do_gen_includes_class& kc_current_view=static_cast<view_do_gen_includes_class&>(kc_current_view_base);
	    {
		const includedeclaration e = this->includedeclaration_1;
		const includedeclarations l = this->includedeclarations_1;
		kc::unparse(l, kc_printer, kc_current_view);
		kc::unparse(e, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_includes_enum: {
	    view_gen_includes_class& kc_current_view=static_cast<view_gen_includes_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("namespace kc { }\
\nusing namespace kc;\
\n/* included stuff */\
\n"), kc_current_view); }
		kc::unparse(this, kc_printer, view_do_gen_includes);
		{ kc_printer(kc_t("/* end included stuff */\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (includedeclarations iterator_ = this; iterator_->includedeclarations_1 != 0; iterator_ = iterator_->includedeclarations_1)
		    iterator_->includedeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_includedeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_do_gen_includes_enum: {
	    view_do_gen_includes_class& kc_current_view=static_cast<view_do_gen_includes_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_includes_enum: {
	    view_gen_includes_class& kc_current_view=static_cast<view_gen_includes_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_includedeclaration_IncludeDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_do_gen_includes_enum: {
	    view_do_gen_includes_class& kc_current_view=static_cast<view_do_gen_includes_class&>(kc_current_view_base);
	    {
		const casestring i = this->casestring_1;
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(i, kc_printer, kc_current_view);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_rwdeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const rwdeclaration rwd = this->rwdeclaration_1;
		const rwdeclarations rrwd = this->rwdeclarations_1;
		kc::unparse(rrwd, kc_printer, kc_current_view);
		kc::unparse(rwd, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (rwdeclarations iterator_ = this; iterator_->rwdeclarations_1 != 0; iterator_ = iterator_->rwdeclarations_1)
		    iterator_->rwdeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_rwdeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_rwdeclaration_RwDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const outmostpatterns op = this->outmostpatterns_1;
		const rewriteclauses rc = this->rewriteclauses_1;
		v_resetbindingidmarks();

		v_add_rewriterulesinfo_to_operator(
		    add_predicates_to_patternrepresentations( syn_outmostpatterns( op ) ), rc );

	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const outmostpatterns op = this->outmostpatterns_1;
		const rewriteclauses rc = this->rewriteclauses_1;
		outmostoperators.push( Niloperators() );
		dollarvarsallowed.push( DVAllowed() );
		phylumstack.push( f_emptyId() );
		variablesstack.push( Nilvariables());
		cl_scope++;

		kc::unparse(op, kc_printer, kc_current_view);
		kc::unparse(rc, kc_printer, kc_current_view);
		outmostoperators.top()->freelist();
		outmostoperators.pop(); phylumstack.pop();
		dollarvarsallowed.pop();
		v_reset_variables_type( variablesstack.top() );
		cl_scope--;
		variablesstack.top()->freelist();
		variablesstack.pop();

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_rewriteclauses::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const rewriteclause rc = this->rewriteclause_1;
		const rewriteclauses rcs = this->rewriteclauses_1;
		kc::unparse(rcs, kc_printer, kc_current_view);
		kc::unparse(rc, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (rewriteclauses iterator_ = this; iterator_->rewriteclauses_1 != 0; iterator_ = iterator_->rewriteclauses_1)
		    iterator_->rewriteclause_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_rewriteclauses::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_rewriteclause_RewriteClause::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const viewnames vn = this->viewnames_1;
		kc::unparse(vn, kc_printer, view_check_r);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_patternchains::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
		const patternchain h = this->patternchain_1;
		const patternchains t = this->patternchains_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const patternchain h = this->patternchain_1;
		const patternchains t = this->patternchains_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (patternchains iterator_ = this; iterator_->patternchains_1 != 0; iterator_ = iterator_->patternchains_1)
		    iterator_->patternchain_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_patternchains::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_patternchain::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
		const patternchainitem h = this->patternchainitem_1;
		const patternchain t = this->patternchain_1;
		ID tmp_type = 0;
		phylumnames tmp_types = 0;
		{
		    phylumnames kc_selvar_0_1 = phylum_cast<phylumnames>( phylumnamesstack.top() );
		    if ((kc_selvar_0_1->prod_sel() == sel_Nilphylumnames)) {

			tmp_type = f_emptyId();
			tmp_types = Nilphylumnames();

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Consphylumnames)) {
			const ID p_h = (kc_selvar_0_1)->ID_1;
			const phylumnames p_t = (kc_selvar_0_1)->phylumnames_1;

			tmp_type = p_h;
			tmp_types = p_t;

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}
		phylumnamesstack.pop();
		phylumnamesstack.push( tmp_types );

		kc::unparse(t, kc_printer, kc_current_view);
		tmp_types = phylumnamesstack.top();
		phylumnamesstack.pop();
		phylumstack.push( tmp_type );
		if (! phylumstack.top()->eq( f_emptyId() )) {
		    h->type = phylumstack.top();

		}

		kc::unparse(h, kc_printer, kc_current_view);
		tmp_type = phylumstack.top();
		phylumstack.pop();
		phylumnamesstack.push( Consphylumnames( tmp_type, tmp_types ) );

	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    if ((this->patternchainitem_1->prod_sel() == sel_PatternchainitemOutmost) && (phylum_cast<const impl_patternchainitem_PatternchainitemOutmost*>(this->patternchainitem_1)->outmostpattern_1->prod_sel() == sel_OPDefault) && (this->patternchain_1->prod_sel() == sel_Conspatternchain) && ((this->patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemOutmost) && (phylum_cast<const impl_patternchainitem_PatternchainitemOutmost*>((this->patternchain_1)->patternchainitem_1)->outmostpattern_1->prod_sel() == sel_OPDefault)) {
		const patternchainitem p = this->patternchainitem_1;
		v_report(NonFatal( FileLine( p->file, p->line ),
			Problem1S( "'default' can not be &-ed with (other) patterns")));

	    } else
		if ((this->patternchainitem_1->prod_sel() == sel_PatternchainitemOutmost) && (phylum_cast<const impl_patternchainitem_PatternchainitemOutmost*>(this->patternchainitem_1)->outmostpattern_1->prod_sel() == sel_OPDefault) && (this->patternchain_1->prod_sel() == sel_Nilpatternchain)) {
	    } else
		if ((this->patternchainitem_1->prod_sel() == sel_PatternchainitemOutmost) && (phylum_cast<const impl_patternchainitem_PatternchainitemOutmost*>(this->patternchainitem_1)->outmostpattern_1->prod_sel() == sel_OPDefault) && (this->patternchain_1->prod_sel() == sel_Conspatternchain)) {
		const patternchainitem p = this->patternchainitem_1;
		v_report(NonFatal( FileLine( p->file, p->line ),
			Problem1S( "'default' can not be &-ed with (other) patterns")));

	    } else
		if ((this->patternchain_1->prod_sel() == sel_Conspatternchain) && ((this->patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemOutmost) && (phylum_cast<const impl_patternchainitem_PatternchainitemOutmost*>((this->patternchain_1)->patternchainitem_1)->outmostpattern_1->prod_sel() == sel_OPDefault)) {
		const patternchainitem p = (this->patternchain_1)->patternchainitem_1;
		v_report(NonFatal( FileLine( p->file, p->line ),
			Problem1S( "'default' can not be &-ed with (other) patterns")));

	    } else
	    {
		const patternchain p = this/**/;
		const patternchainitem h = this->patternchainitem_1;
		const patternchain t = this->patternchain_1;
		ID tmp_type = 0;
		phylumnames tmp_types = 0;
		{
		    phylumnames kc_selvar_0_1 = phylum_cast<phylumnames>( phylumnamesstack.top() );
		    if ((kc_selvar_0_1->prod_sel() == sel_Nilphylumnames)) {

			tmp_type = f_emptyId();
			tmp_types = Nilphylumnames();
			v_report(NonFatal( FileLine( p->file, p->line ),
				Problem1S( "more &-ed patterns than expressions")));

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Consphylumnames)) {
			const ID p_h = (kc_selvar_0_1)->ID_1;
			const phylumnames p_t = (kc_selvar_0_1)->phylumnames_1;

			tmp_type = p_h;
			tmp_types = p_t;

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}
		phylumnamesstack.pop();
		phylumnamesstack.push( tmp_types );

		kc::unparse(t, kc_printer, kc_current_view);
		tmp_types = phylumnamesstack.top();
		phylumnamesstack.pop();
		phylumstack.push( tmp_type ); 
		kc::unparse(h, kc_printer, kc_current_view);
		tmp_type = phylumstack.top();
		phylumstack.pop();
		phylumnamesstack.push( Consphylumnames( tmp_type, tmp_types ) );

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (patternchain iterator_ = this; iterator_->patternchain_1 != 0; iterator_ = iterator_->patternchain_1)
		    iterator_->patternchainitem_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_patternchain::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const patternchain p = this/**/;
		{
		    phylumnames kc_selvar_0_1 = phylum_cast<phylumnames>( phylumnamesstack.top() );
		    if ((kc_selvar_0_1->prod_sel() == sel_Nilphylumnames)) {
			/* EMPTY */ 
				} else
			if ((kc_selvar_0_1->prod_sel() == sel_Consphylumnames)) {
			const ID p_h = (kc_selvar_0_1)->ID_1;
			const phylumnames p_t = (kc_selvar_0_1)->phylumnames_1;

			v_report(NonFatal( FileLine( p->file, p->line ),
				Problem1S( "fewer &-ed patterns than expressions")));

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_outmostpatterns::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const outmostpattern p = this->outmostpattern_1;
		const outmostpatterns rp = this->outmostpatterns_1;
		kc::unparse(rp, kc_printer, kc_current_view);
		kc::unparse(p, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (outmostpatterns iterator_ = this; iterator_->outmostpatterns_1 != 0; iterator_ = iterator_->outmostpatterns_1)
		    iterator_->outmostpattern_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_outmostpatterns::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_patternchainitem_PatternchainitemDollarid::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_patternchainitem_PatternchainitemGroup::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
		const patternchains mp = this->patternchains_1;
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const patternchainitem mpg = this/**/;
		const patternchains mp = this->patternchains_1;
		v_report( NonFatal(  FileLine( mpg->file, mpg->line ),
			Problem1S( "Internal Error: PatternchainitemGroup was not handled correctly" )));

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_patternchainitem_PatternchainitemOutmost::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
		const outmostpattern p = this->outmostpattern_1;
		if (! phylumstack.top()->eq( f_emptyId() )) 
		{
		    p->type = phylumstack.top();

		}
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const outmostpattern p = this->outmostpattern_1;
		if (inforeachcontext.top()!=0) 
		{
		    kc::unparse(p, kc_printer, view_check_is_var);
		}
		else
		{
		    kc::unparse(p, kc_printer, view_check_outmostopers_in_phylum);
		}
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_outmostpattern_OPDefault::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_is_var_enum: {
	    view_check_is_var_class& kc_current_view=static_cast<view_check_is_var_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_outmostpattern_OPWildcard::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_is_var_enum: {
	    view_check_is_var_class& kc_current_view=static_cast<view_check_is_var_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_outmostpattern_OPNonLeafVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_is_var_enum: {
	    view_check_is_var_class& kc_current_view=static_cast<view_check_is_var_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_outmostopers_in_phylum_enum: {
	    view_check_outmostopers_in_phylum_class& kc_current_view=static_cast<view_check_outmostopers_in_phylum_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		const outmostpattern p = this->outmostpattern_1;
		variables tmp = Consvariables( v, variablesstack.top() );
		ID tmp_pid = f_phylumofoutmostpattern( p );
		ID tmp_vid = f_phylumofpatternvariable( v );
		ID tmp_resid = tmp_pid->eq(f_emptyId() ) ? tmp_vid : tmp_pid;
		if ( phylumstack.top()->eq(f_emptyId()) ) {
		    phylumstack.pop();
		    phylumstack.push( tmp_resid );
		}
		variablesstack.pop(); variablesstack.push( tmp );
		v_extendoccur( v, ITPatternVariable( tmp_resid, mkinteger(cl_scope)));

		kc::unparse(p, kc_printer, view_check);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		const outmostpattern p = this->outmostpattern_1;
		variables tmp = Consvariables( v, variablesstack.top() );
		variablesstack.pop(); variablesstack.push( tmp );
		v_extendoccur( v, ITPatternVariable( f_phylumofoutmostpattern( p ),
			mkinteger(cl_scope)));

		kc::unparse(p, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_outmostpattern_OPOperator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_is_var_enum: {
	    view_check_is_var_class& kc_current_view=static_cast<view_check_is_var_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_outmostopers_in_phylum_enum: {
	    view_check_outmostopers_in_phylum_class& kc_current_view=static_cast<view_check_outmostopers_in_phylum_class&>(kc_current_view_base);
	    {
		const ID o = this->ID_1;
		const patterns p = this->patterns_1;
		if (f_useoccuroperator( o )) 
		{
		    if ( phylumstack.top()->eq( f_emptyId() )) {
			phylumstack.pop();
			phylumstack.push( f_phylumofoperator( o ) );
		    }		
		    		if (f_operatorinphylum( o, phylumstack.top())) 
		    {
			operators tmp = Consoperators( o, outmostoperators.top() );
			outmostoperators.pop();
			outmostoperators.push( tmp );
			argumentsstack.push( f_argumentsofoperator( o )->reverse());
			operatorstack.push( o );

			kc::unparse(p, kc_printer, view_check);
			if (! f_Nilarguments( argumentsstack.top() )) {
			    v_report(NonFatal( FileLine( o->file, o->line ),
				    Problem1S1ID( "too few subpatterns for operator", o )));
			}
			argumentsstack.pop();
			operatorstack.pop();

		    }
		    else {
			v_report(NonFatal( FileLine( o->file, o->line ),
				Problem1S1ID1S1ID( "outermost operator", o,
				    "not in expected phylum", phylumstack.top() )));
		    }		
		     }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID o = this->ID_1;
		const patterns p = this->patterns_1;
		if (f_useoccuroperator( o )) 
		{
		    if ( phylumstack.top()->eq( f_emptyId() )) {
			phylumstack.pop();
			phylumstack.push( f_phylumofoperator( o ) );
		    }		
		    {
			operators tmp = Consoperators( o, outmostoperators.top() );
			outmostoperators.pop();
			outmostoperators.push( tmp );
			argumentsstack.push( f_argumentsofoperator( o )->reverse());
			operatorstack.push( o );

			kc::unparse(p, kc_printer, kc_current_view);
			if (! f_Nilarguments( argumentsstack.top() )) {
			    v_report(NonFatal( FileLine( o->file, o->line ),
				    Problem1S1ID( "too few subpatterns for operator", o )));
			}
			argumentsstack.pop();
			operatorstack.pop();

		    }
		}
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_outmostpattern_OPOperatorWildcard::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_is_var_enum: {
	    view_check_is_var_class& kc_current_view=static_cast<view_check_is_var_class&>(kc_current_view_base);
	    {
		const ID i = this->ID_1;
		f_warnifnotvariable( i ); 
	    }
	    break;
	}
	case view_check_outmostopers_in_phylum_enum: {
	    view_check_outmostopers_in_phylum_class& kc_current_view=static_cast<view_check_outmostopers_in_phylum_class&>(kc_current_view_base);
	    {
		const ID o = this->ID_1;
		if (f_useoccuroperator( o )) {
		    if ( phylumstack.top()->eq(f_emptyId() )) {
			phylumstack.pop();
			phylumstack.push( f_phylumofoperator( o ) );
		    }
		    if (! f_operatorinphylum( o, phylumstack.top())) {
			v_report(NonFatal( FileLine( o->file, o->line ),
				Problem1S1ID1S1ID( "outermost operator", o,
				    "not in expected phylum",
				    phylumstack.top() )));
		    } else {
			operators tmp = Consoperators( o, outmostoperators.top() );
			outmostoperators.pop();
			outmostoperators.push( tmp );
		    }
		}

	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID o = this->ID_1;
		if (f_useoccuroperator( o )) {
		    if ( phylumstack.top()->eq( f_emptyId() )) {
			phylumstack.pop();
			phylumstack.push( f_phylumofoperator( o ) );
		    }
		    {	operators tmp = Consoperators( o, outmostoperators.top() );
			outmostoperators.pop();
			outmostoperators.push( tmp );
		    }
		}

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_pattern_PIntLiteral::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		if ((! f_hd_arguments( argumentsstack.top() )->eq(Id( Str( mkcasestring( "integer" ))))) &&
		    (! f_hd_arguments( argumentsstack.top() )->eq(Id( Str( mkcasestring( "real" ))))) ) {
		    v_report(NonFatal( FileLine( i->file, i->line ),
			    Problem1S( "unexpected int subterm" )));
		}

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_pattern_PStringLiteral::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		if ( (! f_hd_arguments( argumentsstack.top() )->eq(Id( Str( mkcasestring( "casestring" ))))) &&
		    (! f_hd_arguments( argumentsstack.top() )->eq(Id( Str( mkcasestring( "nocasestring" ))))))
		{
		    v_report(NonFatal( FileLine( operatorstack.top()->file, operatorstack.top()->line ),
			    Problem1S( "unexpected string subterm" )));
		}

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_pattern_PWildcard::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_pattern_PNonLeafVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		const pattern p = this->pattern_1;
		variables tmp = Consvariables( v, variablesstack.top() );
		variablesstack.pop();
		variablesstack.push( tmp );
		v_extendoccur( v, ITPatternVariable( f_hd_arguments( argumentsstack.top() ),
			mkinteger(cl_scope) ));

		kc::unparse(p, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_pattern_POperator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID o = this->ID_1;
		const patterns p = this->patterns_1;
		if (f_useoccuroperator( o )) 
		{
		    if (f_Nilarguments( argumentsstack.top() )) {
			ID o = operatorstack.top();
			v_report(NonFatal( FileLine( o->file, o->line ),
				Problem1S1ID( "too many subpatterns for operator", o )));
		    } else if (f_operatorinphylum( o, f_hd_arguments( argumentsstack.top() ))) 
		    {
			argumentsstack.push( f_argumentsofoperator( o )->reverse());
			operatorstack.push( o );

			kc::unparse(p, kc_printer, kc_current_view);
			if (! f_Nilarguments( argumentsstack.top() )) {
			    v_report(NonFatal( FileLine( o->file, o->line ),
				    Problem1S1ID( "too few subpatterns for operator", o )));
			}
			argumentsstack.pop();
			operatorstack.pop();

		    }
		    else
		    {
			v_report(NonFatal( FileLine( o->file, o->line ),
				Problem1S1ID1S1ID( "operator", o, "not in phylum",
				    f_hd_arguments( argumentsstack.top() ) )));

		    }
		}
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_pattern_PVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		variables tmp = Consvariables( v, variablesstack.top() );
		variablesstack.pop();
		variablesstack.push( tmp );
		v_extendoccur( v, ITPatternVariable( f_hd_arguments( argumentsstack.top() ),
			mkinteger(cl_scope) ));

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_patterns::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const pattern p = this->pattern_1;
		const patterns rp = this->patterns_1;
		kc::unparse(rp, kc_printer, kc_current_view);
		if (f_Nilarguments( argumentsstack.top() )) {
		    ID o = operatorstack.top();
		    v_report(NonFatal( FileLine( o->file, o->line ),
			    Problem1S1ID( "too many subpatterns for operator", o )));
		} else 
		{
		    arguments tmp;

		    kc::unparse(p, kc_printer, kc_current_view);
		    tmp = argumentsstack.top();
		    argumentsstack.pop();
		    argumentsstack.push( f_tl_arguments( tmp ));

		}
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (patterns iterator_ = this; iterator_->patterns_1 != 0; iterator_ = iterator_->patterns_1)
		    iterator_->pattern_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_patterns::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_term_TIntLiteral::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const INT i = this->INT_1;
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_term_TStringLiteral::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const CexpressionDQ str = this->CexpressionDQ_1;
		{ kc_printer(kc_t("\""), kc_current_view); }
		kc::unparse(str, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_term_TCTerm::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const CexpressionSQ Cexpr = this->CexpressionSQ_1;
		kc::unparse(Cexpr, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_term_TMemberVarDot::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const term t = this->term_1;
		const ID id = this->ID_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t("."), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_term_TMemberVar::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const term t = this->term_1;
		const ID id = this->ID_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_term_TMethodDot::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const term t = this->term_1;
		const ID id = this->ID_1;
		const terms ts = this->terms_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t("."), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ts, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_term_TMethod::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const term t = this->term_1;
		const ID id = this->ID_1;
		const terms ts = this->terms_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ts, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_term_TOperator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ID id = this->ID_1;
		const terms t = this->terms_1;
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_term_TVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ID id = this->ID_1;
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_terms::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->terms_1->prod_sel() == sel_Nilterms)) {
		const term t = this->term_1;
		kc::unparse(t, kc_printer, kc_current_view);
	    } else
	    {
		const term t = this->term_1;
		const terms r_t = this->terms_1;
		kc::unparse(r_t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(t, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_terms::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}

void
impl_fnfiles::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const fnfile f = this->fnfile_1;
		const fnfiles r_f = this->fnfiles_1;
		kc::unparse(r_f, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\t\""), kc_current_view); }
		kc::unparse(f, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\"\n"), kc_current_view); }
	    }
	    break;
	}
    }
}

void
impl_fnfiles::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}


void
impl_fnfile_FnFile::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_fndeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
		const fndeclaration fnd = this->fndeclaration_1;
		const fndeclarations r_fnds = this->fndeclarations_1;
		kc::unparse(r_fnds, kc_printer, kc_current_view);
		kc::unparse(fnd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkdecls_c_enum: {
	    view_gen_fnkdecls_c_class& kc_current_view=static_cast<view_gen_fnkdecls_c_class&>(kc_current_view_base);
	    {
		const fndeclaration fnd = this->fndeclaration_1;
		const fndeclarations r_fnds = this->fndeclarations_1;
		kc::unparse(r_fnds, kc_printer, kc_current_view);
		kc::unparse(fnd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnk_h_enum: {
	    view_gen_fnk_h_class& kc_current_view=static_cast<view_gen_fnk_h_class&>(kc_current_view_base);
	    {
		const fndeclaration fnd = this->fndeclaration_1;
		const fndeclarations r_fnds = this->fndeclarations_1;
		kc::unparse(r_fnds, kc_printer, kc_current_view);
		kc::unparse(fnd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_user_assignment_inis_enum: {
	    view_gen_user_assignment_inis_class& kc_current_view=static_cast<view_gen_user_assignment_inis_class&>(kc_current_view_base);
	    if ((this->fndeclaration_1->prod_sel() == sel_AcMemberDeclaration) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcMemberDecl) && (this->fndeclarations_1->prod_sel() == sel_Nilfndeclarations)) {
		const ID a_id = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ID_2;
		const ac_constant_expression_option a_cexpr = phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_constant_expression_option_1;
		kc::unparse(a_id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(a_cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    } else
		if ((this->fndeclaration_1->prod_sel() == sel_AcMemberDeclaration) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcMemberDecl)) {
		const ID a_id = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ID_2;
		const ac_constant_expression_option a_cexpr = phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_constant_expression_option_1;
		const fndeclarations rargs = this->fndeclarations_1;
		kc::unparse(a_id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(a_cexpr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(rargs, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_operatordefs_hash_c_enum: {
	    view_gen_operatordefs_hash_c_class& kc_current_view=static_cast<view_gen_operatordefs_hash_c_class&>(kc_current_view_base);
	    if ((this->fndeclaration_1->prod_sel() == sel_FnAcDeclaration) && (phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->fnclass_1->prod_sel() == sel_ConstructorFn)) {
		const fndeclaration decl = this->fndeclaration_1;
		const ID oid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const fndeclarations tail = this->fndeclarations_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		if(gl_isnotlist)
		{
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("*\n"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(gl_args, kc_printer, view_gen_fnarg_and_decls);
		if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		kc::unparse(decl->sorted, kc_printer, view_gen_fnk_c);
		{ kc_printer(kc_t(") {\
\n    "), kc_current_view); }
		kc::unparse(gl_args, kc_printer, view_gen_fnarg_asserts);
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_x=new impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		if(gl_isnotlist)
		{
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(gl_args, kc_printer, view_gen_argseqnr_rec);
		if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		kc::unparse(decl->sorted, kc_printer, view_gen_fnkargs);
		{ kc_printer(kc_t(");\
\n	KC_COLLECT_STATS0(KC_CREATE_STATS(sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n    "), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" unique_kc_x= hashtables["), kc_current_view); }
		kc::unparse(gl_sto, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]->ht_check_insert(kc_x);\
\n    if(unique_kc_x!=kc_x) {\
\n    "), kc_current_view); }
		if(!g_options.smart_pointer) 
		{
		    { kc_printer(kc_t("	delete kc_x;\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("	// kc_x already deleted in ht_check_insert\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	kc_x=unique_kc_x;\
\n    } else {\
\n	KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n	kc_x->post_create();\
\n"), kc_current_view); }
		if (f_something_to_initialize( gl_cco )) 
		{
		    { kc_printer(kc_t("		kc_x = kc_initialize_"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t("(kc_x);\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("   }\
\n    return static_cast<impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		if(gl_isnotlist)
		{
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("*>(kc_x);\
\n}\
\n\
\n"), kc_current_view); }
	    } else
	    {
		const fndeclaration head = this->fndeclaration_1;
		const fndeclarations tail = this->fndeclarations_1;
		kc::unparse(tail, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatordefs_nonhash_c_enum: {
	    view_gen_operatordefs_nonhash_c_class& kc_current_view=static_cast<view_gen_operatordefs_nonhash_c_class&>(kc_current_view_base);
	    if ((this->fndeclaration_1->prod_sel() == sel_FnAcDeclaration) && (phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->fnclass_1->prod_sel() == sel_ConstructorFn)) {
		const fndeclaration decl = this->fndeclaration_1;
		const ID oid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const fndeclarations tail = this->fndeclarations_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		if(gl_isnotlist)
		{
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("*\n"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(gl_args, kc_printer, view_gen_fnarg_and_decls);
		if(gl_no_of_args>0 && !f_no_params(params)) { PRINT(","); } 
		kc::unparse(decl->sorted, kc_printer, view_gen_fnk_c);
		{ kc_printer(kc_t(") {\
\n    "), kc_current_view); }
		kc::unparse(gl_args, kc_printer, view_gen_fnarg_asserts);
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_x = new impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		if(gl_isnotlist)
		{
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(gl_args, kc_printer, view_gen_argseqnr_rec);
		if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		kc::unparse(decl->sorted, kc_printer, view_gen_fnkargs);
		{ kc_printer(kc_t(");\
\n	KC_COLLECT_STATS0(KC_CREATE_STATS(sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n	KC_COLLECT_STATS0(KC_EXISTINGNOTFOUND_STATS(sel_"), kc_current_view); }
		kc::unparse(oid, kc_printer, kc_current_view);
		{ kc_printer(kc_t("));\
\n	kc_x->post_create();\
\n    "), kc_current_view); }
		if (f_something_to_initialize( gl_cco )) 
		{
		    { kc_printer(kc_t("    kc_x = kc_initialize_"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t("(kc_x);\
\n    "), kc_current_view); }
		}
		{ kc_printer(kc_t("    return static_cast<impl_"), kc_current_view); }
		kc::unparse(gl_phylum, kc_printer, kc_current_view);
		if(gl_isnotlist)
		{
		    { kc_printer(kc_t("_"), kc_current_view); }
		    kc::unparse(oid, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t("*>(kc_x);\
\n    "), kc_current_view); }
		{ kc_printer(kc_t("}\
\n\
\n    "), kc_current_view); }
	    } else
	    {
		const fndeclaration head = this->fndeclaration_1;
		const fndeclarations tail = this->fndeclarations_1;
		kc::unparse(tail, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    if ((this->fndeclaration_1->prod_sel() == sel_FnAcDeclaration) && (phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->fnclass_1->prod_sel() == sel_ConstructorFn)) {
		const fndeclaration decl = this->fndeclaration_1;
		const ac_direct_declarator id = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_FnAcDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const fndeclarations tail = this->fndeclarations_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("class "), kc_current_view); }
		kc::unparse(id, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("*\b "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" ("), kc_current_view); }
		kc::unparse(gl_args, kc_printer, kc_current_view);
		if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		kc::unparse(decl->sorted, kc_printer, view_gen_fnk_h);
		{ kc_printer(kc_t(");\n"), kc_current_view); }
	    } else
	    {
		const fndeclaration head = this->fndeclaration_1;
		const fndeclarations tail = this->fndeclarations_1;
		kc::unparse(tail, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_count_nonstaticmembers_enum: {
	    view_count_nonstaticmembers_class& kc_current_view=static_cast<view_count_nonstaticmembers_class&>(kc_current_view_base);
	    if ((this->fndeclaration_1->prod_sel() == sel_AcMemberDeclaration) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1->prod_sel() == sel_Consac_declaration_specifiers) && ((phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1)->ac_declaration_specifier_1->prod_sel() == sel_AcDeclSpecTypeSpec) && (phylum_cast<const impl_ac_declaration_specifier_AcDeclSpecTypeSpec*>((phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1)->ac_declaration_specifier_1)->ac_type_specifier_1->prod_sel() == sel_AcTypeSpec) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcMemberDecl) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->fnclass_1->prod_sel() == sel_MemberFn)) {
		const fndeclaration fd = this->fndeclaration_1;
		const ID a_type = phylum_cast<const impl_ac_type_specifier_AcTypeSpec*>(phylum_cast<const impl_ac_declaration_specifier_AcDeclSpecTypeSpec*>((phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1)->ac_declaration_specifier_1)->ac_type_specifier_1)->ID_1;
		const ID a_id = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ID_2;
		const fndeclarations rfd = this->fndeclarations_1;
		kc::unparse(rfd, kc_printer, kc_current_view);
		gl_no_of_args++;
		gl_args=Consarguments(a_type, gl_args);
		gl_members=Consfndeclarations(fd, gl_members);
		gl_idents=Consac_identifier_list(a_id, gl_idents);

	    } else
	    {
		const fndeclarations rfd = this->fndeclarations_1;
		kc::unparse(rfd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_count_attrs_enum: {
	    view_count_attrs_class& kc_current_view=static_cast<view_count_attrs_class&>(kc_current_view_base);
	    if ((this->fndeclaration_1->prod_sel() == sel_AcMemberDeclaration) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1->prod_sel() == sel_Consac_declaration_specifiers) && ((phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1)->ac_declaration_specifier_1->prod_sel() == sel_AcDeclSpecTypeSpec) && (phylum_cast<const impl_ac_declaration_specifier_AcDeclSpecTypeSpec*>((phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1)->ac_declaration_specifier_1)->ac_type_specifier_1->prod_sel() == sel_AcTypeSpec) && (phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcMemberDecl)) {
		const fndeclaration fd = this->fndeclaration_1;
		const ID a_type = phylum_cast<const impl_ac_type_specifier_AcTypeSpec*>(phylum_cast<const impl_ac_declaration_specifier_AcDeclSpecTypeSpec*>((phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declaration_specifiers_1)->ac_declaration_specifier_1)->ac_type_specifier_1)->ID_1;
		const ID a_id = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(phylum_cast<const impl_fndeclaration_AcMemberDeclaration*>(this->fndeclaration_1)->ac_declarator_1)->ac_direct_declarator_1)->ID_2;
		const fndeclarations rfd = this->fndeclarations_1;
		kc::unparse(rfd, kc_printer, kc_current_view);
		if (fd->is_attr) {
		    gl_no_of_args++;
		    gl_args=Consarguments(a_type, gl_args);
		    gl_members=Consfndeclarations(fd, gl_members);
		    gl_idents=Consac_identifier_list(a_id, gl_idents);
		} 
			} else
	    {
		const fndeclarations rfd = this->fndeclarations_1;
		kc::unparse(rfd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const fndeclaration a_fnd = this->fndeclaration_1;
		const fndeclarations r_fnd = this->fndeclarations_1;
		kc::unparse(r_fnd, kc_printer, kc_current_view);
		kc::unparse(a_fnd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const fndeclaration fnd = this->fndeclaration_1;
		const fndeclarations fnds = this->fndeclarations_1;
		kc::unparse(fnds, kc_printer, kc_current_view);
		kc::unparse(fnd, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (fndeclarations iterator_ = this; iterator_->fndeclarations_1 != 0; iterator_ = iterator_->fndeclarations_1)
		    iterator_->fndeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_fndeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_fnkdecls_c_enum: {
	    view_gen_fnkdecls_c_class& kc_current_view=static_cast<view_gen_fnkdecls_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\
\n#ifndef KC_TRACE_PROVIDED\
\n#define KC_TRACE_PROVIDED(COND,FILE,LINE,NODE) COND\
\n#endif\
\n\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnk_h_enum: {
	    view_gen_fnk_h_class& kc_current_view=static_cast<view_gen_fnk_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordefs_hash_c_enum: {
	    view_gen_operatordefs_hash_c_class& kc_current_view=static_cast<view_gen_operatordefs_hash_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordefs_nonhash_c_enum: {
	    view_gen_operatordefs_nonhash_c_class& kc_current_view=static_cast<view_gen_operatordefs_nonhash_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_operatordecls_h_enum: {
	    view_gen_operatordecls_h_class& kc_current_view=static_cast<view_gen_operatordecls_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_count_nonstaticmembers_enum: {
	    view_count_nonstaticmembers_class& kc_current_view=static_cast<view_count_nonstaticmembers_class&>(kc_current_view_base);
	    {
		gl_no_of_args = 0; gl_args = Nilarguments(); gl_members=Nilfndeclarations(); gl_idents=Nilac_identifier_list(); 
	    }
	    break;
	}
	case view_count_attrs_enum: {
	    view_count_attrs_class& kc_current_view=static_cast<view_count_attrs_class&>(kc_current_view_base);
	    {
		gl_no_of_args = 0; gl_args = Nilarguments(); gl_members=Nilfndeclarations(); gl_idents=Nilac_identifier_list(); 
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fndeclaration_AcMemberDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression) && (this->fnclass_1->prod_sel() == sel_StaticFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->last_line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression) && (this->fnclass_1->prod_sel() == sel_StaticFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->last_line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcMemberDecl) && (this->fnclass_1->prod_sel() == sel_StaticFn) && (KC_TRACE_PROVIDED((is_attr), "util.k", 672, this))) {
		const ID pid = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ID aid = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ID_2;
		v_report(NonFatal( FileLine(file, last_line) ,
			Problem1S1ID1S1ID( "attribute", aid,
			    "(with %attr) should not be static in phylum", pid)));

	    } else
		if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcMemberDecl)) {
		const ID pid = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ID aid = phylum_cast<const impl_ac_direct_declarator_AcMemberDecl*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ID_2;
		{
		    ID kc_selvar_0_1 = phylum_cast<ID>(pid);
		    if ((kc_selvar_0_1->prod_sel() == sel_Id)) {
			const uniqID uid = phylum_cast<const impl_ID_Id*>(kc_selvar_0_1)->uniqID_1;
			{
			    IDtype kc_selvar_1_1 = phylum_cast<IDtype>( uid->type );
			    if ((kc_selvar_1_1->prod_sel() == sel_ITUnknown)) {

				v_report(NonFatal( FileLine(file, last_line),
					Problem1S1ID1S1ID( "attribute", aid,
					    "is not part of any phylum or operator; defined in", pid)));

			    } else
			    {

			    }
			}

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

		if (f_ispredefinedphylum(pid) && strcmp(f_strofID(pid), "abstract_phylum")!=0
		    && strcmp(f_strofID(pid), "abstract_list")!=0)
		v_report(NonFatal( FileLine(this->file, this->last_line) ,
			Problem1S1ID1S1ID( "attribute", aid,
			    "must not be defined in predefined phylum", pid)));

		if(!f_listelementphylum(f_phylumofoperator(pid))->eq(f_emptyId()))
		v_report(NonFatal( FileLine(file, last_line) ,
			Problem1S1ID1S1ID( "attribute", aid,
			    "must not be declared in list operator", pid)));

	    } else
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}


void
impl_fndeclaration_FnAcDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (this->fnclass_1->prod_sel() == sel_ConstructorFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const ID oid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const fnclass fnc = this->fnclass_1;
		bool is_ctor=false;
		{
		    fnclass kc_selvar_0_1 = phylum_cast<fnclass>(fnc);
		    if ((kc_selvar_0_1->prod_sel() == sel_ConstructorFn)) {
			is_ctor=true; 
				} else
		    {

		    }
		}

		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		if(!is_ctor) PRINT("~"); 
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("("), kc_current_view); }
		arguments args=f_argumentsofoperator(oid);
		if(is_ctor) 
		{
		    kc::unparse(args, kc_printer, view_count_args);
		    if (f_ispredefinedphylum(f_phylumofoperator(oid))) 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls_predef);
		    }
		    else 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls);
		    }
		    if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		    kc::unparse(params, kc_printer, view_gen_fnk_h);
		}
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    } else
		if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (this->fnclass_1->prod_sel() == sel_DestructorFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const ID oid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const fnclass fnc = this->fnclass_1;
		bool is_ctor=false;
		{
		    fnclass kc_selvar_0_1 = phylum_cast<fnclass>(fnc);
		    if ((kc_selvar_0_1->prod_sel() == sel_ConstructorFn)) {
			is_ctor=true; 
				} else
		    {

		    }
		}

		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		if(!is_ctor) PRINT("~"); 
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("("), kc_current_view); }
		arguments args=f_argumentsofoperator(oid);
		if(is_ctor) 
		{
		    kc::unparse(args, kc_printer, view_count_args);
		    if (f_ispredefinedphylum(f_phylumofoperator(oid))) 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls_predef);
		    }
		    else 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls);
		    }
		    if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		    kc::unparse(params, kc_printer, view_gen_fnk_h);
		}
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    } else
		if ((this->fnclass_1->prod_sel() == sel_ConvOperatorFn)) {
		const ac_declarator fn_d = this->ac_declarator_1;
		kc::unparse(fn_d, kc_printer, kc_current_view);
	    } else
	    {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (this->fnclass_1->prod_sel() == sel_ConstructorFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const ID oid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const ac_opt_base_init_list base_init = this->ac_opt_base_init_list_1;
		const Ctext ct = this->Ctext_1;
		const fnclass fnc = this->fnclass_1;

		gl_return_ID = 0;
		gl_return_type = "";
		gl_star_count = f_stars_of_declarator( fn_d );
		gl_function = f_strofID(f_id_of_ctor_dtor_decl(fn_d));
		gl_operator=oid;
		bool is_ctor=false;
		{
		    fnclass kc_selvar_0_1 = phylum_cast<fnclass>(fnc);
		    if ((kc_selvar_0_1->prod_sel() == sel_ConstructorFn)) {
			is_ctor=true; 
				} else
		    {

		    }
		}

		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("::"), kc_current_view); }
		if(!is_ctor) { PRINT("~"); } 
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("("), kc_current_view); }
		arguments args=f_argumentsofoperator(oid);
		if(is_ctor) 
		{
		    kc::unparse(args, kc_printer, view_count_args);
		    if (f_ispredefinedphylum(f_phylumofoperator(oid))) 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls_predef);
		    }
		    else 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls);
		    }
		    if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		    kc::unparse(this->sorted, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t(")"), kc_current_view); }
		kc::unparse(base_init, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("{"), kc_current_view); }
		if(is_ctor) 
		{
		    if (f_ispredefinedphylum(f_phylumofoperator(oid))) 
		    {
			kc::unparse(args, kc_printer, view_gen_assignments_predef);
		    }
		    else if(The_abstract_phylum_decl->subphylum(0)->eq(oid)) 
		    {
			if(g_options.smart_pointer) 
			{
			    { kc_printer(kc_t("_ref=0;\
\n		"), kc_current_view); }
			}
		    }
		    else 
		    {
			kc::unparse(args, kc_printer, view_gen_assignments);
		    }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->last_line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("}"), kc_current_view); }
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		gl_return_type = "";
		gl_return_ID = 0;
		gl_star_count = 0;
		gl_function = "";

	    } else
		if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (this->fnclass_1->prod_sel() == sel_DestructorFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const ID oid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const ac_parameter_type_list params = phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1;
		const ac_opt_base_init_list base_init = this->ac_opt_base_init_list_1;
		const Ctext ct = this->Ctext_1;
		const fnclass fnc = this->fnclass_1;

		gl_return_ID = 0;
		gl_return_type = "";
		gl_star_count = f_stars_of_declarator( fn_d );
		gl_function = f_strofID(f_id_of_ctor_dtor_decl(fn_d));
		gl_operator=oid;
		bool is_ctor=false;
		{
		    fnclass kc_selvar_0_1 = phylum_cast<fnclass>(fnc);
		    if ((kc_selvar_0_1->prod_sel() == sel_ConstructorFn)) {
			is_ctor=true; 
				} else
		    {

		    }
		}

		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("::"), kc_current_view); }
		if(!is_ctor) { PRINT("~"); } 
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("("), kc_current_view); }
		arguments args=f_argumentsofoperator(oid);
		if(is_ctor) 
		{
		    kc::unparse(args, kc_printer, view_count_args);
		    if (f_ispredefinedphylum(f_phylumofoperator(oid))) 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls_predef);
		    }
		    else 
		    {
			kc::unparse(args, kc_printer, view_gen_fnarg_and_decls);
		    }
		    if(gl_no_of_args && !f_no_params(params)) { PRINT(","); } 
		    kc::unparse(this->sorted, kc_printer, kc_current_view);
		}
		{ kc_printer(kc_t(")"), kc_current_view); }
		kc::unparse(base_init, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("{"), kc_current_view); }
		if(is_ctor) 
		{
		    if (f_ispredefinedphylum(f_phylumofoperator(oid))) 
		    {
			kc::unparse(args, kc_printer, view_gen_assignments_predef);
		    }
		    else if(The_abstract_phylum_decl->subphylum(0)->eq(oid)) 
		    {
			if(g_options.smart_pointer) 
			{
			    { kc_printer(kc_t("_ref=0;\
\n		"), kc_current_view); }
			}
		    }
		    else 
		    {
			kc::unparse(args, kc_printer, view_gen_assignments);
		    }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->last_line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("}"), kc_current_view); }
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		gl_return_type = "";
		gl_return_ID = 0;
		gl_star_count = 0;
		gl_function = "";

	    } else
		if ((this->fnclass_1->prod_sel() == sel_ConvOperatorFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const Ctext ct = this->Ctext_1;
		const ID fn_name = this->ID_1;
		const fnclass fnc = this->fnclass_1;

		gl_return_ID = 0;
		gl_return_type = "";
		gl_star_count = f_stars_of_declarator( fn_d );
		gl_function = f_strofID( fn_name );

		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("()"), kc_current_view); }
		kc::unparse(fn_d, kc_printer, view_gen_opt_const);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("{"), kc_current_view); }
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->last_line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("}"), kc_current_view); }
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		gl_return_type = "";
		gl_return_ID = 0;
		gl_star_count = 0;
		gl_function = "";

	    } else
	    {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const Ctext ct = this->Ctext_1;
		const ID fn_name = this->ID_1;
		const fnclass fnc = this->fnclass_1;

		gl_return_ID = f_ID_of_ac_declaration_specifiers( fn_ds );
		gl_return_type = f_strofID( gl_return_ID );
		gl_star_count = f_stars_of_declarator( fn_d );
		gl_function = f_strofID( fn_name );
		if (strcmp(gl_function, "main")==0) PRINT("} // namespace kc\n");

		kc::unparse(fnc, kc_printer, kc_current_view);
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(this->sorted, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
		kc::unparse(fn_d, kc_printer, view_gen_opt_const);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("{"), kc_current_view); }
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(this->last_line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(this->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("}"), kc_current_view); }
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("\
\n"), kc_current_view); }
		gl_return_type = "";
		gl_return_ID = 0;
		gl_star_count = 0;
		if (strcmp(gl_function, "main")==0) PRINT("namespace kc {\r\n");
		gl_function = "";

	    }
	    break;
	}
	case view_gen_fnkdecls_c_enum: {
	    view_gen_fnkdecls_c_class& kc_current_view=static_cast<view_gen_fnkdecls_c_class&>(kc_current_view_base);
	    if ((this->fnclass_1->prod_sel() == sel_GlobalFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_MemberFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_ConstructorFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_DestructorFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_ConvOperatorFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_StaticFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		const fnclass fn_c = this->fnclass_1;
		kc::unparse(fn_c, kc_printer, kc_current_view);
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t(" ("), kc_current_view); }
		kc::unparse(this->sorted, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnk_h_enum: {
	    view_gen_fnk_h_class& kc_current_view=static_cast<view_gen_fnk_h_class&>(kc_current_view_base);
	    if ((this->ID_1->prod_sel() == sel_Id) && (phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1->prod_sel() == sel_Str) && (kc_strcmp(phylum_cast<const impl_uniqID_Str*>(phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1)->casestring_1->name, kc_t("main"))==0) && (this->fnclass_1->prod_sel() == sel_GlobalFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_GlobalFn)) {
		const ac_declaration_specifiers fn_ds = this->ac_declaration_specifiers_1;
		const ac_declarator fn_d = this->ac_declarator_1;
		kc::unparse(fn_ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(fn_d, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t(" ("), kc_current_view); }
		kc::unparse(this->sorted, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    } else
		if ((this->fnclass_1->prod_sel() == sel_StaticFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_MemberFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_ConstructorFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_DestructorFn)) {
	    } else
		if ((this->fnclass_1->prod_sel() == sel_ConvOperatorFn)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    if ((this->ac_declaration_specifiers_1->prod_sel() == sel_Nilac_declaration_specifiers) && (this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_pointer_option_1->prod_sel() == sel_Nopointer) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_ref_option_1->prod_sel() == sel_AcNoRef) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_class_qualifier_list_1->prod_sel() == sel_Nilac_class_qualifier_list) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_type_qualifier_1->prod_sel() == sel_AcNoQualifier) && (this->ac_declaration_list_1->prod_sel() == sel_Nilac_declaration_list) && (this->fnclass_1->prod_sel() == sel_ConstructorFn)) {
		const ID pid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
		{
		    ID kc_selvar_0_1 = phylum_cast<ID>(pid);
		    if ((kc_selvar_0_1->prod_sel() == sel_Id)) {
			const uniqID uid = phylum_cast<const impl_ID_Id*>(kc_selvar_0_1)->uniqID_1;
			{
			    IDtype kc_selvar_1_1 = phylum_cast<IDtype>( uid->type );
			    if ((kc_selvar_1_1->prod_sel() == sel_ITUnknown)) {

				v_report(Warning( FileLine(file, last_line),
					Problem1S1ID( "constructor does not belong to phylum or operator:",
					    pid)));

			    } else
			    {

			    }
			}

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    } else
		if ((this->ac_declarator_1->prod_sel() == sel_AcDeclarator) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_pointer_option_1->prod_sel() == sel_Nopointer) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_ref_option_1->prod_sel() == sel_AcNoRef) && (phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcQualifiedDeclProto) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_class_qualifier_list_1->prod_sel() == sel_Nilac_class_qualifier_list) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1->prod_sel() == sel_AcDirectDeclId) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1->prod_sel() == sel_AcParList) && (phylum_cast<const impl_ac_parameter_type_list_AcParList*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_parameter_type_list_1)->ac_parameter_list_1->prod_sel() == sel_Nilac_parameter_list) && (phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_type_qualifier_1->prod_sel() == sel_AcNoQualifier) && (this->ac_declaration_list_1->prod_sel() == sel_Nilac_declaration_list) && (this->ac_opt_base_init_list_1->prod_sel() == sel_AcNoBaseInit) && (this->fnclass_1->prod_sel() == sel_DestructorFn)) {
		const ID pid = phylum_cast<const impl_ac_direct_declarator_AcDirectDeclId*>(phylum_cast<const impl_ac_direct_declarator_AcQualifiedDeclProto*>(phylum_cast<const impl_ac_declarator_AcDeclarator*>(this->ac_declarator_1)->ac_direct_declarator_1)->ac_direct_declarator_1)->ID_1;
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
		{
		    ID kc_selvar_0_1 = phylum_cast<ID>(pid);
		    if ((kc_selvar_0_1->prod_sel() == sel_Id)) {
			const uniqID uid = phylum_cast<const impl_ID_Id*>(kc_selvar_0_1)->uniqID_1;
			{
			    IDtype kc_selvar_1_1 = phylum_cast<IDtype>( uid->type );
			    if ((kc_selvar_1_1->prod_sel() == sel_ITUnknown)) {

				v_report(Warning( FileLine(file, last_line),
					Problem1S1ID( "destructor does not belong to phylum or operator:",
					    pid)));

			    } else
			    {

			    }
			}

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    } else
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_fnclass_ConvOperatorFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fnclass_DestructorFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fnclass_ConstructorFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fnclass_MemberFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fnclass_StaticFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("static "), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_fnclass_GlobalFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_Ctext::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		gl_print_line_directive = false;
		Ctext inversion_ = this->reverse();
		for (Ctext iterator_ = inversion_; iterator_->Ctext_1 != 0; iterator_ = iterator_->Ctext_1)
		iterator_->Ctext_elem_1->unparse(kc_printer, kc_current_view);
		inversion_->freelist();

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (Ctext iterator_ = this; iterator_->Ctext_1 != 0; iterator_ = iterator_->Ctext_1)
		    iterator_->Ctext_elem_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_Ctext::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextWithexpression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const withcases wc = this->withcases_1;
		kc::unparse(wc, kc_printer, kc_current_view);
		check_with_patterns(wc->wcinfo); 
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Ctext_elem ctw = this/**/;
		const withexpressions wexpr = this->withexpressions_1;
		const withcases wcs = this->withcases_1;
		const contextinfo in_foreach_context = this->contextinfo_1;
		if (wcs->wcinfo) 
		{

		    ID selvar;
		    int p;
		    patternchain fe_pc = 0;
		    withcasesinfo rewr_wcinfo = rewrite_withcasesinfo(wcs->wcinfo);
		    {
			contextinfo kc_selvar_0_1 = phylum_cast<contextinfo>(in_foreach_context);
			if ((kc_selvar_0_1->prod_sel() == sel_NotInForeachContext)) {

			    selvar = f_mkselvar("kc_selvar_", g_ctext_level);
			    selvar->line = ctw->line; 
			    selvar->file = ctw->file;
			    cf_pushselvar( selvar );
			    inforeachcontext.push(0);

			} else
			    if ((kc_selvar_0_1->prod_sel() == sel_InForeachContext)) {
			    const patternchain mp = phylum_cast<const impl_contextinfo_InForeachContext*>(kc_selvar_0_1)->patternchain_1;

			    selvar = cf_topselvar(); 
			    inforeachcontext.push(1);
			    fe_pc = mp;

			} else
			    kc_no_default_in_with( "", __LINE__, __FILE__ );
		    }

		    { kc_printer(kc_t("{\
\n"), kc_current_view); }
		    if (! inforeachcontext.top()) 
		    {
			kc::unparse(wexpr, kc_printer, kc_current_view);
		    }
		    if (! inforeachcontext.top()) {
			dollarvarstack.push( selvar );
			dollarvarextstack.push( Id(Str(mkcasestring("_1"))) );
		    } else if ((p = pos_of_sole_dollar_or_pattern_in_patternchain(fe_pc)) >= 0) {
			dollarvarstack.push( selvar );
			dollarvarextstack.push( f_mkselvar("_", p) );
		    }

		    kc::unparse(rewr_wcinfo, kc_printer, view_gen_withcases_and_default);
		    if (! inforeachcontext.top()) {
			cf_popselvar();
			dollarvarstack.pop();
			dollarvarextstack.pop();
		    } else if (p >= 0) {
			dollarvarstack.pop();
			dollarvarextstack.pop();
		    }
		    inforeachcontext.pop();

		    { kc_printer(kc_t("}\
\n"), kc_current_view); }
		    gl_print_line_directive = true; 
		     }
		else { v_report(NonFatal( FileLine( this->file, this->line ), Problem1S( "internal error: no info for withcases of CTextWithexpression" )));
		} 
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const withexpressions we = this->withexpressions_1;
		const withcases wc = this->withcases_1;
		const contextinfo in_foreach_context = this->contextinfo_1;

		withexpressionsstack.push( we );
		{
		    contextinfo kc_selvar_0_1 = phylum_cast<contextinfo>(in_foreach_context);
		    if ((kc_selvar_0_1->prod_sel() == sel_NotInForeachContext)) {

			inforeachcontext.push(0);
			phylumnamesstack.push( we->type );

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_InForeachContext)) {

			inforeachcontext.push(1);

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}
		if (we->length() == 1) {
		    dollarvarsallowed.push( DVAllowed() );
		} else {
		    dollarvarsallowed.push( DVDisallowed() );
		}

		kc::unparse(wc, kc_printer, kc_current_view);
		kc::unparse(wc, kc_printer, view_set_type);
		we->type = phylumnamesstack.top();
		withexpressionsstack.pop();
		dollarvarsallowed.pop();

		kc::unparse(we, kc_printer, kc_current_view);
		if (! inforeachcontext.top() ) {
		    phylumnamesstack.pop();
		}
		inforeachcontext.pop();

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextForeachexpression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		const foreach_after fa = this->foreach_after_1;
		kc::unparse(ct, kc_printer, kc_current_view);
		kc::unparse(fa, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const idCexpressions idcexpr = this->idCexpressions_1;
		const Ctext ct = this->Ctext_1;
		const foreach_after fa = this->foreach_after_1;

		ID selvar = f_mkselvar("kc_selvar_", g_ctext_level);
		selvar->line = this->line; 
		selvar->file = this->file;
		cf_pushselvar( selvar );

		{ kc_printer(kc_t("{\
\n"), kc_current_view); }
		kc::unparse(idcexpr, kc_printer, kc_current_view);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("while(\
\n"), kc_current_view); }
		kc::unparse(idcexpr, kc_printer, view_gen_initializephyla_whiletest_c);
		{ kc_printer(kc_t("    ) {\
\n"), kc_current_view); }
		kc::unparse(idcexpr, kc_printer, view_gen_initializephyla_init_el_c);
		{ kc_printer(kc_t("{\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, kc_current_view);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
		kc::unparse(idcexpr, kc_printer, view_gen_initializephyla_update_loop_c);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
		cf_popselvar();
		selvar = Id(Str(mkcasestring("kc_fe_selvar")));
		selvar->line = fa->line; 
		selvar->file = fa->file;
		cf_pushselvar( selvar );

		kc::unparse(fa, kc_printer, kc_current_view);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
		cf_popselvar();
		gl_print_line_directive = true;

	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const idCexpressions ide = this->idCexpressions_1;
		const Ctext ct = this->Ctext_1;
		const foreach_after fa = this->foreach_after_1;
		phylumnames tmp = f_phylumnames_foreachwith_vars( ide );
		phylumnamesstack.push( tmp );

		kc::unparse(ide, kc_printer, kc_current_view);
		kc::unparse(ct, kc_printer, kc_current_view);
		phylumnamesstack.pop();


		kc::unparse(fa, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextCbody::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		if (gl_print_line_directive) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(this->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(this->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    gl_print_line_directive = false; 
		     }
		{ kc_printer(kc_t("{"), kc_current_view); }
		kc::unparse(ct, kc_printer, kc_current_view);
		{ kc_printer(kc_t("}"), kc_current_view); }
		if (gl_print_line_directive) 
		{
		    { kc_printer(kc_t("\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextCexpressionSQ::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const CexpressionSQ cesq = this->CexpressionSQ_1;
		if (gl_print_line_directive) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(this->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(this->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    gl_print_line_directive = false; 
		     }
		{ kc_printer(kc_t("'"), kc_current_view); }
		kc::unparse(cesq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("'"), kc_current_view); }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextCexpressionDQ::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const CexpressionDQ cedq = this->CexpressionDQ_1;
		if (gl_print_line_directive) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(this->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(this->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    gl_print_line_directive = false; 
		     }
		{ kc_printer(kc_t("\""), kc_current_view); }
		kc::unparse(cedq, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextNl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const integer i = this->integer_1;
		charruns nl_string = Newlines(); 
		 if (gl_print_line_directive) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(this->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(this->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    gl_print_line_directive = false; 
		     nl_string->set(i->value - 1); 
		     }
		else 
		{
		    nl_string->set(i->value); 
		     }
		kc::unparse(nl_string, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextDollarVar::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		ID oid = f_emptyId(), dollarvar = dollarvarstack.top(), dollarvarext = dollarvarextstack.top();
		argument arg;
		bool nulvar = true;
		{
		    INT kc_selvar_0_1 = phylum_cast<INT>( i );
		    if ((kc_selvar_0_1->prod_sel() == sel_Int)) {
			const integer ii = phylum_cast<const impl_INT_Int*>(kc_selvar_0_1)->integer_1;

			if (ii->value != 0) {
			    nulvar = false;
			    oid = operatorstack.top();
			    arg = f_argumentofoperator( oid, i );
			}   
				} else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

		if (nulvar) 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		}
		else 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		    { kc_printer(kc_t("->"), kc_current_view); }
		    kc::unparse(arg, kc_printer, kc_current_view);
		    arg->free( false );  
		     }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    if ((this->INT_1->prod_sel() == sel_Int)) {
		const INT i = this->INT_1;
		const integer iv = phylum_cast<const impl_INT_Int*>(this->INT_1)->integer_1;
		if (  f_DvIsDisallowed( dollarvarsallowed.top() )) {
		    v_report(NonFatal( FileLine( i->file, i->line ),
			    Problem1S1INT(
				"illegal dollar variable (not allowed in &-ed pattern context)", i )));
		} else if (!outmostoperators.empty()) {
		    v_check_dollarvar_attribute_in_operators( i, Nilunpattributes(),
			outmostoperators.top() );
		} else if (iv->value != 0) {
		    v_report(NonFatal( FileLine( i->file, i->line ),
			    Problem1S1INT( "illegal dollar variable", i )));
		}

	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_Ctext_elem_CTextLine::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const casestring cs = this->casestring_1;
		if (gl_print_line_directive) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(this->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(this->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    gl_print_line_directive = false; 
		     }
		kc::unparse(cs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_foreach_after_ForeachAfter::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		{ kc_printer(kc_t("{\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, kc_current_view);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const patternchain mp = this->patternchain_1;
		const idCexpressions ide = this->idCexpressions_1;
		const Ctext ct = this->Ctext_1;
		phylumnames tmp = f_phylumnames_foreachwith_listvars( ide );
		phylumnamesstack.push( tmp );

		kc::unparse(ct, kc_printer, kc_current_view);
		phylumnamesstack.pop();


	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_foreach_after_NoForeachAfter::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_contextinfo_NotInForeachContext::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_contextinfo_InForeachContext::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_withexpressions::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const withexpression h = this->withexpression_1;
		const withexpressions t = this->withexpressions_1;
		ID selvar = cf_topselvar(); 
		kc::unparse(t, kc_printer, kc_current_view);
		g_withexpr_nr++;

		if (h->line) 
		{
		    if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(h->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(h->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		}
		assertCond( ! (h->type->eq( f_emptyId())) ); 
		kc::unparse(h->type, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(selvar, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(g_withexpr_nr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" = phylum_cast<"), kc_current_view); }
		kc::unparse(h->type, kc_printer, kc_current_view);
		{ kc_printer(kc_t(">("), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const withexpression h = this->withexpression_1;
		const withexpressions t = this->withexpressions_1;
		ID tmp_type = 0;
		phylumnames tmp_types = 0;
		t->type = phylumnamesstack.top();
		{
		    phylumnames kc_selvar_0_1 = phylum_cast<phylumnames>( t->type );
		    if ((kc_selvar_0_1->prod_sel() == sel_Nilphylumnames)) {

			tmp_type = f_emptyId();
			tmp_types = Nilphylumnames();

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Consphylumnames)) {
			const ID p_h = (kc_selvar_0_1)->ID_1;
			const phylumnames p_t = (kc_selvar_0_1)->phylumnames_1;

			tmp_type = p_h;
			tmp_types = p_t;

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}
		phylumnamesstack.pop();
		phylumnamesstack.push( tmp_types );

		kc::unparse(t, kc_printer, kc_current_view);
		h->type = tmp_type;
		if (tmp_type->eq( f_emptyId())) {
		    v_report(NonFatal( FileLine( h->file, h->line ),
			    Problem1S1we( "could not infer type of with-expression argument:", h )));
		}

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (withexpressions iterator_ = this; iterator_->withexpressions_1 != 0; iterator_ = iterator_->withexpressions_1)
		    iterator_->withexpression_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_withexpressions::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		g_withexpr_nr = 0; 
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_withexpression_WECexpression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const Cexpression cexpr = this->Cexpression_1;
		kc::unparse(cexpr, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const Cexpression ce = this->Cexpression_1;
		kc::unparse(ce, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_withexpression_WEVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const ID i = this->ID_1;
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_withcases::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const withcase wc = this->withcase_1;
		const withcases r_wcs = this->withcases_1;
		kc::unparse(wc, kc_printer, kc_current_view);
		kc::unparse(r_wcs, kc_printer, kc_current_view);
		this->wcinfo = r_wcs->wcinfo;
		{
		    withcasesinfo kc_fe_selvar_1 =  wc->wcinfo ;

		    while(
			    kc_fe_selvar_1->prod_sel() == sel_Conswithcasesinfo
			) {
			withcaseinfo kc_selvar_0_1 = kc_fe_selvar_1->withcaseinfo_1;
			{
			    {
				{
				    const withcaseinfo wci = kc_selvar_0_1;

				    this->wcinfo = insertin_withcasesinfo( wci, this->wcinfo );

				}
			    }

			}
			kc_fe_selvar_1 = kc_fe_selvar_1->withcasesinfo_1;

		    }
		}

	    }
	    break;
	}
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
		const withcase wc = this->withcase_1;
		const withcases wcs = this->withcases_1;
		kc::unparse(wcs, kc_printer, kc_current_view);
		kc::unparse(wc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const withcase wc = this->withcase_1;
		const withcases wcs = this->withcases_1;
		kc::unparse(wcs, kc_printer, kc_current_view);
		kc::unparse(wc, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (withcases iterator_ = this; iterator_->withcases_1 != 0; iterator_ = iterator_->withcases_1)
		    iterator_->withcase_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_withcases::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		this->wcinfo = Nilwithcasesinfo(); 
	    }
	    break;
	}
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_withcase_Withcase::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const patternchains mp = this->patternchains_1;
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
		v_resetbindingidmarks();

		this->wcinfo = f_withcasesinfo( add_predicates_to_patternrepresentations(
			syn_patternchains( mp ) ), ct );

	    }
	    break;
	}
	case view_set_type_enum: {
	    view_set_type_class& kc_current_view=static_cast<view_set_type_class&>(kc_current_view_base);
	    {
		const patternchains mp = this->patternchains_1;
		kc::unparse(mp, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const patternchains mp = this->patternchains_1;
		const Ctext ct = this->Ctext_1;
		outmostoperators.push( Niloperators() );
		variablesstack.push( Nilvariables());
		cl_scope++;

		kc::unparse(mp, kc_printer, kc_current_view);
		kc::unparse(ct, kc_printer, kc_current_view);
		outmostoperators.top()->freelist();
		outmostoperators.pop();
		v_reset_variables_type( variablesstack.top() );
		cl_scope--;
		variablesstack.top()->freelist();
		variablesstack.pop();

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_unparsedeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
		const unparsedeclaration ud = this->unparsedeclaration_1;
		const unparsedeclarations uds = this->unparsedeclarations_1;
		kc::unparse(uds, kc_printer, kc_current_view);
		kc::unparse(ud, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const unparsedeclaration ud = this->unparsedeclaration_1;
		const unparsedeclarations uds = this->unparsedeclarations_1;
		kc::unparse(uds, kc_printer, kc_current_view);
		kc::unparse(ud, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const unparsedeclaration ud = this->unparsedeclaration_1;
		const unparsedeclarations uds = this->unparsedeclarations_1;
		kc::unparse(uds, kc_printer, kc_current_view);
		kc::unparse(ud, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (unparsedeclarations iterator_ = this; iterator_->unparsedeclarations_1 != 0; iterator_ = iterator_->unparsedeclarations_1)
		    iterator_->unparsedeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_unparsedeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_unparsedeclaration_UnparseDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
		const unparseclauses uc = this->unparseclauses_1;
		kc::unparse(uc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const outmostpatterns op = this->outmostpatterns_1;
		const unparseclauses uc = this->unparseclauses_1;
		kc::unparse(uc, kc_printer, kc_current_view);
		v_resetbindingidmarks();

		this->patternreps = syn_outmostpatterns( op );
		this->patternreps = add_predicates_to_patternrepresentations(this->patternreps);
		v_add_unparsedeclsinfo_to_operator( this->patternreps, uc );

	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const unparseclauses uc = this->unparseclauses_1;
		kc::unparse(uc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const outmostpatterns op = this->outmostpatterns_1;
		const unparseclauses uc = this->unparseclauses_1;
		outmostoperators.push( Niloperators() );
		dollarvarsallowed.push( DVAllowed() );
		phylumstack.push( f_emptyId() );
		variablesstack.push( Nilvariables());
		cl_scope++;

		kc::unparse(op, kc_printer, kc_current_view);
		kc::unparse(uc, kc_printer, kc_current_view);
		outmostoperators.top()->freelist();
		outmostoperators.pop();
		dollarvarsallowed.pop();
		phylumstack.pop();
		v_reset_variables_type( variablesstack.top() );
		cl_scope--;
		variablesstack.top()->freelist();
		variablesstack.pop();

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_unparseclauses::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
		const unparseclause uc = this->unparseclause_1;
		const unparseclauses ucs = this->unparseclauses_1;
		kc::unparse(ucs, kc_printer, kc_current_view);
		kc::unparse(uc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const unparseclause a_uc = this->unparseclause_1;
		const unparseclauses r_uc = this->unparseclauses_1;
		kc::unparse(r_uc, kc_printer, kc_current_view);
		kc::unparse(a_uc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const unparseclause uc = this->unparseclause_1;
		const unparseclauses ucs = this->unparseclauses_1;
		kc::unparse(ucs, kc_printer, kc_current_view);
		kc::unparse(uc, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const unparseclause uc = this->unparseclause_1;
		const unparseclauses ucs = this->unparseclauses_1;
		kc::unparse(ucs, kc_printer, kc_current_view);
		kc::unparse(uc, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (unparseclauses iterator_ = this; iterator_->unparseclauses_1 != 0; iterator_ = iterator_->unparseclauses_1)
		    iterator_->unparseclause_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_unparseclauses::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_unparseclause_UnparseClause::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
		const unparseitems ui = this->unparseitems_1;
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const unparseitems ui = this->unparseitems_1;
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const unparseitems ui = this->unparseitems_1;
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const unparseitems u_i = this->unparseitems_1;
		kc::unparse(u_i, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const unparseitems ui = this->unparseitems_1;
		The_current_unparseitems=ui; 
		kc::unparse(ui, kc_printer, kc_current_view);
		The_current_unparseitems=NULL; 
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const viewnames vn = this->viewnames_1;
		const unparseitems ui = this->unparseitems_1;
		kc::unparse(vn, kc_printer, view_check_u);
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_viewnames::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_rview_class_def_enum: {
	    view_rview_class_def_class& kc_current_view=static_cast<view_rview_class_def_class&>(kc_current_view_base);
	    {
		const viewnames node = this/**/;
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		if(!node->is_extern) 
		{
		    { kc_printer(kc_t("struct "), kc_current_view); }
		    if(g_options.dllexports!="") {
			PRINT(g_options.dllexports.c_str());
			PRINT(" ");
		    } 
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class: rview_class {\
\n	"), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class():rview_class("), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_enum){}\
\n};\
\nextern "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("class "), kc_current_view); }
		    if(g_options.dllexports!="") {
			PRINT(g_options.dllexports.c_str());
			PRINT(" ");
		    } 
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_baseclass: public rview_class {\
\n\rprotected:\v\
\n	"), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_baseclass():rview_class("), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_enum){}\
\n};\
\n// class "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class is defined externally\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_uview_class_def_enum: {
	    view_uview_class_def_class& kc_current_view=static_cast<view_uview_class_def_class&>(kc_current_view_base);
	    {
		const viewnames node = this/**/;
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		if(!node->is_extern) 
		{
		    { kc_printer(kc_t("struct "), kc_current_view); }
		    if(g_options.dllexports!="") {
			PRINT(g_options.dllexports.c_str());
			PRINT(" ");
		    } 
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class: uview_class {\
\n	"), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class():uview_class("), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_enum){}\
\n};\
\nextern "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("class "), kc_current_view); }
		    if(g_options.dllexports!="") {
			PRINT(g_options.dllexports.c_str());
			PRINT(" ");
		    } 
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_baseclass: public uview_class {\
\n\rprotected:\v\
\n	"), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_baseclass():uview_class("), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_enum){}\
\n};\
\n// class "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class is defined externally\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_viewvars_c_enum: {
	    view_gen_viewvars_c_class& kc_current_view=static_cast<view_gen_viewvars_c_class&>(kc_current_view_base);
	    if ((this->viewnames_1->prod_sel() == sel_Nilviewnames)) {
		const viewnames node = this/**/;
		const ID vn = this->ID_1;
		if(!node->is_extern) 
		{
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		}
	    } else
	    {
		const viewnames node = this/**/;
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		if(!node->is_extern) 
		{
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("_class "), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_unpk_c_enum: {
	    view_gen_unpk_c_class& kc_current_view=static_cast<view_gen_unpk_c_class&>(kc_current_view_base);
	    {
		const viewnames node = this/**/;
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		if(!node->is_extern) 
		{
		    { kc_printer(kc_t("{\""), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\",&"), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("},\
\n	"), kc_current_view); }
		}
		else
		{
		    { kc_printer(kc_t("{\""), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\", 0},\
\n	"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_uview_def_enum: {
	    view_uview_def_class& kc_current_view=static_cast<view_uview_def_class&>(kc_current_view_base);
	    {
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		kc::unparse(vn, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_enum"), kc_current_view); }
		{ kc_printer(kc_t(",\n\t"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedecls_h_enum: {
	    view_gen_unparsedecls_h_class& kc_current_view=static_cast<view_gen_unparsedecls_h_class&>(kc_current_view_base);
	    if ((this->viewnames_1->prod_sel() == sel_Nilviewnames)) {
		const ID vn = this->ID_1;
		{ kc_printer(kc_t("\t"), kc_current_view); }
		kc::unparse(vn, kc_printer, kc_current_view);
	    } else
	    {
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		{ kc_printer(kc_t(",\n\t"), kc_current_view); }
		kc::unparse(vn, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_rewritek_c_enum: {
	    view_gen_rewritek_c_class& kc_current_view=static_cast<view_gen_rewritek_c_class&>(kc_current_view_base);
	    {
		const viewnames node = this/**/;
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		if(!node->is_extern) 
		{
		    { kc_printer(kc_t("{\""), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\",&"), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("},\
\n	"), kc_current_view); }
		}
		else
		{
		    { kc_printer(kc_t("{\""), kc_current_view); }
		    kc::unparse(vn, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\", 0},\
\n	"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_rewritek_h_enum: {
	    view_gen_rewritek_h_class& kc_current_view=static_cast<view_gen_rewritek_h_class&>(kc_current_view_base);
	    {
		const ID vn = this->ID_1;
		const viewnames r_vn = this->viewnames_1;
		kc::unparse(r_vn, kc_printer, kc_current_view);
		kc::unparse(vn, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_enum"), kc_current_view); }
		{ kc_printer(kc_t(",\n\t"), kc_current_view); }
	    }
	    break;
	}
	case view_check_r_enum: {
	    view_check_r_class& kc_current_view=static_cast<view_check_r_class&>(kc_current_view_base);
	    {
		const ID vn = this->ID_1;
		const viewnames vns = this->viewnames_1;
		kc::unparse(vns, kc_printer, kc_current_view);
		if (pg_rviewshavebeendefined)
		f_useoccurrviewname( vn );
		else
		v_extendoccur_nowarning( vn, ITUserRView() );
		v_add_to_rviewnames( vn );

	    }
	    break;
	}
	case view_check_u_enum: {
	    view_check_u_class& kc_current_view=static_cast<view_check_u_class&>(kc_current_view_base);
	    {
		const ID vn = this->ID_1;
		const viewnames vns = this->viewnames_1;
		kc::unparse(vns, kc_printer, kc_current_view);
		if (pg_uviewshavebeendefined)
		f_useoccuruviewname( vn );
		else
		v_extendoccur_nowarning( vn, ITUserUView() );
		v_add_to_uviewnames( vn );

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (viewnames iterator_ = this; iterator_->viewnames_1 != 0; iterator_ = iterator_->viewnames_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_viewnames::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_viewvars_c_enum: {
	    view_gen_viewvars_c_class& kc_current_view=static_cast<view_gen_viewvars_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unpk_c_enum: {
	    view_gen_unpk_c_class& kc_current_view=static_cast<view_gen_unpk_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_uview_def_enum: {
	    view_uview_def_class& kc_current_view=static_cast<view_uview_def_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedecls_h_enum: {
	    view_gen_unparsedecls_h_class& kc_current_view=static_cast<view_gen_unparsedecls_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_rewritek_c_enum: {
	    view_gen_rewritek_c_class& kc_current_view=static_cast<view_gen_rewritek_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_rewritek_h_enum: {
	    view_gen_rewritek_h_class& kc_current_view=static_cast<view_gen_rewritek_h_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_r_enum: {
	    view_check_r_class& kc_current_view=static_cast<view_check_r_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_u_enum: {
	    view_check_u_class& kc_current_view=static_cast<view_check_u_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_unparseitems::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    if ((this->unparseitems_1->prod_sel() == sel_Nilunparseitems)) {
		const unparseitem head = this->unparseitem_1;
		kc::unparse(head, kc_printer, kc_current_view);
	    } else
	    {
		const unparseitem head = this->unparseitem_1;
		const unparseitems tail = this->unparseitems_1;
		kc::unparse(head, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(tail, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
		const unparseitem ui = this->unparseitem_1;
		const unparseitems uis = this->unparseitems_1;
		kc::unparse(uis, kc_printer, kc_current_view);
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const unparseitem a_ui = this->unparseitem_1;
		const unparseitems r_ui = this->unparseitems_1;
		kc::unparse(r_ui, kc_printer, kc_current_view);
		kc::unparse(a_ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const unparseitem a_ui = this->unparseitem_1;
		const unparseitems r_ui = this->unparseitems_1;
		kc::unparse(r_ui, kc_printer, kc_current_view);
		kc::unparse(a_ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const unparseitem a_ui = this->unparseitem_1;
		const unparseitems r_ui = this->unparseitems_1;
		kc::unparse(r_ui, kc_printer, kc_current_view);
		kc::unparse(a_ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const unparseitem ui = this->unparseitem_1;
		const unparseitems uis = this->unparseitems_1;
		kc::unparse(uis, kc_printer, kc_current_view);
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const unparseitem ui = this->unparseitem_1;
		const unparseitems uis = this->unparseitems_1;
		kc::unparse(uis, kc_printer, kc_current_view);
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (unparseitems iterator_ = this; iterator_->unparseitems_1 != 0; iterator_ = iterator_->unparseitems_1)
		    iterator_->unparseitem_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_unparseitems::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\t\"\""), kc_current_view); }
	    }
	    break;
	}
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_unparseitem_UViewVarDecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    if ((this->Cexpression_1->prod_sel() == sel_NilCexpression)) {
		const ID type = this->ID_1;
		const ID name = this->ID_2;
		{ kc_printer(kc_t("\t"), kc_current_view); }
		kc::unparse(type, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class "), kc_current_view); }
		kc::unparse(name, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
	    {
		const ID type = this->ID_1;
		const ID name = this->ID_2;
		const Cexpression expr = this->Cexpression_1;
		{ kc_printer(kc_t("\t"), kc_current_view); }
		kc::unparse(type, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class "), kc_current_view); }
		kc::unparse(name, kc_printer, kc_current_view);
		kc::unparse(expr, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    if ((this->Cexpression_1->prod_sel() == sel_NilCexpression)) {
		const ID type = this->ID_1;
		const ID name = this->ID_2;
		{ kc_printer(kc_t("\t"), kc_current_view); }
		kc::unparse(type, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class "), kc_current_view); }
		kc::unparse(name, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    } else
	    {
		const ID type = this->ID_1;
		const ID name = this->ID_2;
		const Cexpression expr = this->Cexpression_1;
		{ kc_printer(kc_t("\t"), kc_current_view); }
		kc::unparse(type, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class "), kc_current_view); }
		kc::unparse(name, kc_printer, kc_current_view);
		kc::unparse(expr, kc_printer, view_gen_initializephyla_c);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const ID vno = this->ID_1;
		kc::unparse(vno, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unparseitem_UnpBody::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    if ((this->languageoption_1->prod_sel() == sel_NoLanguagename)) {
		const unparseitems items = this->unparseitems_1;
		kc::unparse(items, kc_printer, kc_current_view);
	    } else
		if ((this->languageoption_1->prod_sel() == sel_LanguageList)) {
		const languagenames qual = phylum_cast<const impl_languageoption_LanguageList*>(this->languageoption_1)->languagenames_1;
		const unparseitems items = this->unparseitems_1;
		f_useoccurlanguagename(qual); 
		kc::unparse(items, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const languageoption lang = this->languageoption_1;
		const unparseitems a_unparseitems = this->unparseitems_1;
		kc::unparse(lang, kc_printer, kc_current_view);
		{ kc_printer(kc_t("{\
\n"), kc_current_view); }
		kc::unparse(a_unparseitems, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const languageoption lang = this->languageoption_1;
		const unparseitems a_unparseitems = this->unparseitems_1;
		kc::unparse(lang, kc_printer, kc_current_view);
		{ kc_printer(kc_t("{\
\n"), kc_current_view); }
		kc::unparse(a_unparseitems, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const unparseitems ui = this->unparseitems_1;
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const unparseitems ui = this->unparseitems_1;
		kc::unparse(ui, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unparseitem_UnpCtext::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    if ((this->languageoption_1->prod_sel() == sel_NoLanguagename)) {
	    } else
		if ((this->languageoption_1->prod_sel() == sel_LanguageList)) {
		const languagenames qual = phylum_cast<const impl_languageoption_LanguageList*>(this->languageoption_1)->languagenames_1;
		f_useoccurlanguagename(qual); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const languageoption lang = this->languageoption_1;
		const Ctext ct = this->Ctext_1;
		kc::unparse(lang, kc_printer, kc_current_view);
		if(lang->prod_sel()==sel_LanguageList) 
		{
		    { kc_printer(kc_t("{\n"), kc_current_view); }
		}
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		if(lang->prod_sel()==sel_LanguageList) 
		{
		    { kc_printer(kc_t("}\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const languageoption lang = this->languageoption_1;
		const Ctext ct = this->Ctext_1;
		kc::unparse(lang, kc_printer, kc_current_view);
		if(lang->prod_sel()==sel_LanguageList) 
		{
		    { kc_printer(kc_t("{\n"), kc_current_view); }
		}
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		if(lang->prod_sel()==sel_LanguageList) 
		{
		    { kc_printer(kc_t("}\n"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_make_patternreps_enum: {
	    view_make_patternreps_class& kc_current_view=static_cast<view_make_patternreps_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const Ctext ct = this->Ctext_1;
		kc::unparse(ct, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unparseitem_UnpSubexpr::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    if ((this->languageoption_1->prod_sel() == sel_NoLanguagename)) {
	    } else
		if ((this->languageoption_1->prod_sel() == sel_LanguageList)) {
		const languagenames qual = phylum_cast<const impl_languageoption_LanguageList*>(this->languageoption_1)->languagenames_1;
		f_useoccurlanguagename(qual); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const languageoption lang = this->languageoption_1;
		const unpsubterm sub = this->unpsubterm_1;
		const viewnameoption a_vnameopt = this->viewnameoption_1;
		ID phy = f_typeofunpsubterm( sub, operatorstack.top() ); 
		kc::unparse(lang, kc_printer, kc_current_view);
		{ kc_printer(kc_t("kc::unparse("), kc_current_view); }
		kc::unparse(sub, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", kc_printer, "), kc_current_view); }
		kc::unparse(a_vnameopt, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const languageoption lang = this->languageoption_1;
		const unpsubterm sub = this->unpsubterm_1;
		const viewnameoption a_vnameopt = this->viewnameoption_1;
		ID phy = f_typeofunpsubterm( sub, operatorstack.top() ); 
		kc::unparse(lang, kc_printer, kc_current_view);
		{ kc_printer(kc_t("kc::unparse("), kc_current_view); }
		kc::unparse(sub, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", kc_printer, "), kc_current_view); }
		kc::unparse(a_vnameopt, kc_printer, kc_current_view);
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const viewnameoption vno = this->viewnameoption_1;
		kc::unparse(vno, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const unpsubterm us = this->unpsubterm_1;
		kc::unparse(us, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unparseitem_UnpStr::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_collect_strings_enum: {
	    view_collect_strings_class& kc_current_view=static_cast<view_collect_strings_class&>(kc_current_view_base);
	    {
		add_string_to_collection(this); 
	    }
	    break;
	}
	case view_output_collection_enum: {
	    view_output_collection_class& kc_current_view=static_cast<view_output_collection_class&>(kc_current_view_base);
	    {
		const CexpressionDQ expr = this->CexpressionDQ_1;
		{ kc_printer(kc_t("\t\""), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\""), kc_current_view); }
	    }
	    break;
	}
	case view_checklanguagenames_enum: {
	    view_checklanguagenames_class& kc_current_view=static_cast<view_checklanguagenames_class&>(kc_current_view_base);
	    if ((this->languageoption_1->prod_sel() == sel_NoLanguagename)) {
	    } else
		if ((this->languageoption_1->prod_sel() == sel_LanguageList)) {
		const languagenames qual = phylum_cast<const impl_languageoption_LanguageList*>(this->languageoption_1)->languagenames_1;
		f_useoccurlanguagename(qual); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const CexpressionDQ a_CexpressionDQ = this->CexpressionDQ_1;
		const viewnameoption a_vnameopt = this->viewnameoption_1;
		ug_viewnameopt = a_vnameopt; 
		 if(pg_languageshavebeendefined) 
		{

		    static char buf[10];
		    static long last_nr=-1;
		    sprintf(buf,"%d",this->text_nr);

		    if(last_nr!=this->text_nr) 
		    {
			last_nr=this->text_nr;  
				{ kc_printer(kc_t("       { kc_printer(LANG_TEXT("), kc_current_view); }
			kc_printer( buf, base_uview ); 
				{ kc_printer(kc_t("), "), kc_current_view); }
			kc::unparse(a_vnameopt, kc_printer, kc_current_view);
			{ kc_printer(kc_t("); }\n"), kc_current_view); }
		    }
		}
		else 
		{
		    kc_printer( "", view_no_of_printed_string_chars_reset ); 
		    	{ kc_printer(kc_t("	{ kc_printer(kc_t(\""), kc_current_view); }
		    kc::unparse(a_CexpressionDQ, kc_printer, view_gen_unpstr_c);
		    { kc_printer(kc_t("\"), "), kc_current_view); }
		    kc::unparse(a_vnameopt, kc_printer, kc_current_view);
		    { kc_printer(kc_t("); }\
\n"), kc_current_view); }
		}
		ug_viewnameopt = 0; 
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const CexpressionDQ a_CexpressionDQ = this->CexpressionDQ_1;
		const viewnameoption a_vnameopt = this->viewnameoption_1;
		ug_viewnameopt = a_vnameopt; 
		 if(pg_languageshavebeendefined) 
		{

		    static char buf[10];
		    static long last_nr=-1;
		    sprintf(buf,"%d",this->text_nr);

		    if(last_nr!=this->text_nr) 
		    {
			last_nr=this->text_nr;  
				{ kc_printer(kc_t("       { kc_printer(LANG_TEXT("), kc_current_view); }
			kc_printer( buf, base_uview ); 
				{ kc_printer(kc_t("), "), kc_current_view); }
			kc::unparse(a_vnameopt, kc_printer, kc_current_view);
			{ kc_printer(kc_t("); }\n"), kc_current_view); }
		    }
		}
		else 
		{
		    kc_printer( "", view_no_of_printed_string_chars_reset ); 
		    	{ kc_printer(kc_t("	{ kc_printer(kc_t(\""), kc_current_view); }
		    kc::unparse(a_CexpressionDQ, kc_printer, view_gen_unpstr_c);
		    { kc_printer(kc_t("\"), "), kc_current_view); }
		    kc::unparse(a_vnameopt, kc_printer, kc_current_view);
		    { kc_printer(kc_t("); }\
\n"), kc_current_view); }
		}
		ug_viewnameopt = 0; 
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const viewnameoption vno = this->viewnameoption_1;
		kc::unparse(vno, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unpsubterm_UnpCastedVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const ID a_id = this->ID_2;
		kc::unparse(a_id, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID a_id = this->ID_2;
		kc::unparse(a_id, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unpsubterm_UnpDollarvarAttr::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const unpattributes a_unpattributes = this->unpattributes_1;
		kc::unparse(this, kc_printer, view_gen_initializephyla_c);
		kc::unparse(a_unpattributes, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const unpattributes a_unpattributes = this->unpattributes_1;
		kc::unparse(this, kc_printer, view_gen_initializephyla_c);
		kc::unparse(a_unpattributes, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		ID oid = f_emptyId(), dollarvar = dollarvarstack.top(), dollarvarext = dollarvarextstack.top();
		argument arg;
		bool nulvar = true;
		{
		    INT kc_selvar_0_1 = phylum_cast<INT>( i );
		    if ((kc_selvar_0_1->prod_sel() == sel_Int)) {
			const integer ii = phylum_cast<const impl_INT_Int*>(kc_selvar_0_1)->integer_1;

			if (ii->value != 0) {
			    nulvar = false;
			    oid = operatorstack.top();
			    arg = f_argumentofoperator( oid, i );
			}   
				} else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

		if (nulvar) 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		}
		else 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		    { kc_printer(kc_t("->"), kc_current_view); }
		    kc::unparse(arg, kc_printer, kc_current_view);
		    arg->free( false );  
		     }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		const unpattributes unp_a = this->unpattributes_1;
		v_check_dollarvar_attribute_in_operators( i, unp_a, outmostoperators.top() ); 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unpsubterm_UnpSubAttr::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const ID st = this->ID_1;
		const unpattributes a_unpattributes = this->unpattributes_1;
		kc::unparse(st, kc_printer, kc_current_view);
		kc::unparse(a_unpattributes, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID st = this->ID_1;
		const unpattributes a_unpattributes = this->unpattributes_1;
		kc::unparse(st, kc_printer, kc_current_view);
		kc::unparse(a_unpattributes, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID v_id = this->ID_1;
		const unpattributes unp_a = this->unpattributes_1;
		ID p_id;
		if (f_useoccurpatternvariable( v_id ) && (p_id = f_phylumofpatternvariable( v_id)))
		f_check_unpattributes_in_phylum( unp_a, p_id );
		v_syn_type_attribute_ID( v_id );

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unpsubterm_UnpDollarvarTerm::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		kc::unparse(this, kc_printer, view_gen_initializephyla_c);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		kc::unparse(this, kc_printer, view_gen_initializephyla_c);
	    }
	    break;
	}
	case view_gen_initializephyla_c_enum: {
	    view_gen_initializephyla_c_class& kc_current_view=static_cast<view_gen_initializephyla_c_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		ID oid = f_emptyId(), dollarvar = dollarvarstack.top(), dollarvarext = dollarvarextstack.top();
		argument arg;
		bool nulvar = true;
		{
		    INT kc_selvar_0_1 = phylum_cast<INT>( i );
		    if ((kc_selvar_0_1->prod_sel() == sel_Int)) {
			const integer ii = phylum_cast<const impl_INT_Int*>(kc_selvar_0_1)->integer_1;

			if (ii->value != 0) {
			    nulvar = false;
			    oid = operatorstack.top();
			    arg = f_argumentofoperator( oid, i );
			}   
				} else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

		if (nulvar) 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		}
		else 
		{
		    kc::unparse(dollarvar, kc_printer, kc_current_view);
		    kc::unparse(dollarvarext, kc_printer, kc_current_view);
		    { kc_printer(kc_t("->"), kc_current_view); }
		    kc::unparse(arg, kc_printer, kc_current_view);
		    arg->free( false );  
		     }
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const INT i = this->INT_1;
		v_check_dollarvar_attribute_in_operators( i, Nilunpattributes(),
		    outmostoperators.top() );

	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_unpsubterm_UnpSubTerm::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const ID st = this->ID_1;
		kc::unparse(st, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID st = this->ID_1;
		kc::unparse(st, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_enum: {
	    view_check_class& kc_current_view=static_cast<view_check_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;







	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_unpattributes::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const ID a_attr = this->ID_1;
		const unpattributes r_attr = this->unpattributes_1;
		kc::unparse(r_attr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		kc::unparse(a_attr, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID a_attr = this->ID_1;
		const unpattributes r_attr = this->unpattributes_1;
		kc::unparse(r_attr, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->"), kc_current_view); }
		kc::unparse(a_attr, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (unpattributes iterator_ = this; iterator_->unpattributes_1 != 0; iterator_ = iterator_->unpattributes_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_unpattributes::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_viewnameoption_YesViewname::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		kc::unparse(v, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		kc::unparse(v, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
		const ID vn = this->ID_1;
		if(!is_uview_var(vn)) f_useoccuruviewname( vn ); 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_viewnameoption_NoViewname::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("kc_current_view"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("kc_current_view"), kc_current_view); }
	    }
	    break;
	}
	case view_check_viewnames_enum: {
	    view_check_viewnames_class& kc_current_view=static_cast<view_check_viewnames_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_languageoption_LanguageList::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		const languagenames langs = this->languagenames_1;
		{ kc_printer(kc_t("if("), kc_current_view); }
		kc::unparse(langs, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")\n    "), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const languagenames langs = this->languagenames_1;
		{ kc_printer(kc_t("if("), kc_current_view); }
		kc::unparse(langs, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")\n    "), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_languageoption_NoLanguagename::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_languagenames::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    if ((this->languagenames_1->prod_sel() == sel_Nillanguagenames)) {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("is_language("), kc_current_view); }
		kc::unparse(id, kc_printer, base_uview);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    } else
	    {
		const ID id = this->ID_1;
		const languagenames tail = this->languagenames_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" || is_language("), kc_current_view); }
		kc::unparse(id, kc_printer, base_uview);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    if ((this->languagenames_1->prod_sel() == sel_Nillanguagenames)) {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("is_language("), kc_current_view); }
		kc::unparse(id, kc_printer, base_uview);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    } else
	    {
		const ID id = this->ID_1;
		const languagenames tail = this->languagenames_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" || is_language("), kc_current_view); }
		kc::unparse(id, kc_printer, base_uview);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedecls_h_enum: {
	    view_gen_unparsedecls_h_class& kc_current_view=static_cast<view_gen_unparsedecls_h_class&>(kc_current_view_base);
	    if ((this->languagenames_1->prod_sel() == sel_Nillanguagenames)) {
		const ID id = this->ID_1;
		{ kc_printer(kc_t("extern char* kc_language_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("[];\n"), kc_current_view); }
	    } else
	    {
		const ID id = this->ID_1;
		const languagenames tail = this->languagenames_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("extern char* kc_language_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("[];\n"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (languagenames iterator_ = this; iterator_->languagenames_1 != 0; iterator_ = iterator_->languagenames_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_languagenames::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fileline_PosNoFileLine::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		if (pg_lineno != 0) 
		{
		    { kc_printer(kc_t(" at "), kc_current_view); }
		    if (strcmp(pg_filename->name, "") != 0) 
		    {
			kc::unparse(pg_filename, kc_printer, kc_current_view);
		    }
		    { kc_printer(kc_t(":"), kc_current_view); }
		    kc::unparse(pg_lineno, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" col:"), kc_current_view); }
		    kc::unparse(pg_column, kc_printer, kc_current_view);
		}
	    }
	    break;
	}
	case view_error_format_enum: {
	    view_error_format_class& kc_current_view=static_cast<view_error_format_class&>(kc_current_view_base);
	    {
		if (pg_lineno != 0) {
		    if (strcmp(pg_filename->name, "") != 0) {
			kc_current_view.file(pg_filename->name);
		    }
		    kc_current_view.line(pg_lineno);
		    kc_current_view.column(pg_column);
		} 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fileline_NoFileLine::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		if (pg_lineno != 0) 
		{
		    { kc_printer(kc_t(" at "), kc_current_view); }
		    if (strcmp(pg_filename->name, "") != 0) 
		    {
			kc::unparse(pg_filename, kc_printer, kc_current_view);
		    }
		    { kc_printer(kc_t(":"), kc_current_view); }
		    kc::unparse(pg_lineno, kc_printer, kc_current_view);
		}
	    }
	    break;
	}
	case view_error_format_enum: {
	    view_error_format_class& kc_current_view=static_cast<view_error_format_class&>(kc_current_view_base);
	    {
		if (pg_lineno != 0) {
		    if (strcmp(pg_filename->name, "") != 0) {
			kc_current_view.file(pg_filename->name);
		    }
		    kc_current_view.line(pg_lineno);
		} 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_fileline_FileLine::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		if (line != 0) 
		{
		    { kc_printer(kc_t(" at "), kc_current_view); }
		    if (strcmp(file->name, "") != 0) 
		    {
			kc::unparse(file, kc_printer, kc_current_view);
		    }
		    { kc_printer(kc_t(":"), kc_current_view); }
		    kc::unparse(line, kc_printer, kc_current_view);
		}
		else  if (pg_lineno != 0) 
		{
		    { kc_printer(kc_t(" at "), kc_current_view); }
		    if (strcmp(pg_filename->name, "") != 0) 
		    {
			kc::unparse(pg_filename, kc_printer, kc_current_view);
		    }
		    { kc_printer(kc_t(":"), kc_current_view); }
		    kc::unparse(pg_lineno, kc_printer, kc_current_view);
		}
	    }
	    break;
	}
	case view_error_format_enum: {
	    view_error_format_class& kc_current_view=static_cast<view_error_format_class&>(kc_current_view_base);
	    {
		if (line != 0) {
		    if (strcmp(file->name, "") != 0) {
			kc_current_view.file(file->name);
		    }
		    kc_current_view.line(line);
		} else  if (pg_lineno != 0) {
		    if (strcmp(pg_filename->name, "") != 0) {
			kc_current_view.file(pg_filename->name);
		    }
		    kc_current_view.line(pg_lineno);
		} 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_scopetypefilelinestack::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (scopetypefilelinestack iterator_ = this; iterator_->scopetypefilelinestack_1 != 0; iterator_ = iterator_->scopetypefilelinestack_1)
		    iterator_->scopetypefileline_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_scopetypefilelinestack::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_scopetypefileline_ScopeTypeFileLine::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITLanguageName::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITPatternVariable::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("pattern variable"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUserFunction::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("function"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUserRView::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("rewrite view"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITPredefinedRView::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("predefined rewrite view"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUViewVar::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUserUView::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("unparse view"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITPredefinedUView::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("predefined unparse view"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITStorageClass::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("storageclass"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITPredefinedStorageClass::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("predefined storageclass"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUserOperator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's an "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("operator"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITPredefinedOperator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("predefined operator"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUserPhylum::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("phylum"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITPredefinedPhylum::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("(it's a "), kc_current_view); }
		kc::unparse(this, kc_printer, view_error);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("predefined phylum"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_IDtype_ITUnknown::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_tID_enum: {
	    view_error_tID_class& kc_current_view=static_cast<view_error_tID_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_operators::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (operators iterator_ = this; iterator_->operators_1 != 0; iterator_ = iterator_->operators_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_operators::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_phyla::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_printdotedges_c_enum: {
	    view_gen_printdotedges_c_class& kc_current_view=static_cast<view_gen_printdotedges_c_class&>(kc_current_view_base);
	    {
		const ID a_phy = this->ID_1;
		const phyla r_phy = this->phyla_1;
		kc::unparse(r_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	case phylum_"), kc_current_view); }
		kc::unparse(a_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": {\
\n	    kc_do_printdot_id_of__"), kc_current_view); }
		kc::unparse(a_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t("(kc_f, kc_p->ptr_to.yt_"), kc_current_view); }
		kc::unparse(a_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", use_context_when_sharing_leaves, kc_p->ptr_from.yt_voidptr, kc_p->son_nr);\
\n	break; }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_printdotdefs_c_enum: {
	    view_gen_printdotdefs_c_class& kc_current_view=static_cast<view_gen_printdotdefs_c_class&>(kc_current_view_base);
	    {
		const ID a_phy = this->ID_1;
		const phyla r_phy = this->phyla_1;

		assertionFailed("Not used anymore"); 
		kc::unparse(r_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t("    assertReason(kc_phy != phylum_"), kc_current_view); }
		kc::unparse(a_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", \"kc_do_printdot_phylum called with phylum_"), kc_current_view); }
		kc::unparse(a_phy, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" argument\");\
\n"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (phyla iterator_ = this; iterator_->phyla_1 != 0; iterator_ = iterator_->phyla_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_phyla::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_printdotedges_c_enum: {
	    view_gen_printdotedges_c_class& kc_current_view=static_cast<view_gen_printdotedges_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_printdotdefs_c_enum: {
	    view_gen_printdotdefs_c_class& kc_current_view=static_cast<view_gen_printdotdefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_variables::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (variables iterator_ = this; iterator_->variables_1 != 0; iterator_ = iterator_->variables_1)
		    iterator_->ID_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_variables::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_dollarvarstatus_DVDisallowed::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_dollarvarstatus_DVAllowed::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_tribool_Bigger::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_tribool_Smaller::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_tribool_Equal::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_patternrepresentations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (patternrepresentations iterator_ = this; iterator_->patternrepresentations_1 != 0; iterator_ = iterator_->patternrepresentations_1)
		    iterator_->patternrepresentation_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_patternrepresentations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_patternrepresentation::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_unp_predicates_enum: {
	    view_unp_predicates_class& kc_current_view=static_cast<view_unp_predicates_class&>(kc_current_view_base);
	    if ((this->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate) && (this->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const Cexpression cexpr = phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>(this->elem_patternrepresentation_1)->Cexpression_1;
		gl_outer_view=kc_current_view; 
			{ kc_printer(kc_t("KC_TRACE_PROVIDED(("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, view_gen_user_predicates);
		{ kc_printer(kc_t("), \""), kc_current_view); }
		kc::unparse(cexpr->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(cexpr->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this)"), kc_current_view); }
	    } else
		if ((this->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate)) {
		const Cexpression cexpr = phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>(this->elem_patternrepresentation_1)->Cexpression_1;
		const patternrepresentation r_p = this->patternrepresentation_1;
		gl_outer_view=kc_current_view; 
		kc::unparse(r_p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") && KC_TRACE_PROVIDED(("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, view_gen_user_predicates);
		{ kc_printer(kc_t("), \""), kc_current_view); }
		kc::unparse(cexpr->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(cexpr->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this"), kc_current_view); }
	    } else
		if ((this->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const elem_patternrepresentation p = this->elem_patternrepresentation_1;
		kc::unparse(p, kc_printer, kc_current_view);
	    } else
	    {
		const elem_patternrepresentation p = this->elem_patternrepresentation_1;
		const patternrepresentation r_p = this->patternrepresentation_1;
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") && ("), kc_current_view); }
		kc::unparse(r_p, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_wc_predicates_enum: {
	    view_wc_predicates_class& kc_current_view=static_cast<view_wc_predicates_class&>(kc_current_view_base);
	    if ((this->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate) && (this->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const Cexpression cexpr = phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>(this->elem_patternrepresentation_1)->Cexpression_1;
		gl_outer_view=kc_current_view; 
			{ kc_printer(kc_t("KC_TRACE_PROVIDED(("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, view_gen_user_predicates);
		{ kc_printer(kc_t("), \""), kc_current_view); }
		kc::unparse(cexpr->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(cexpr->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this)"), kc_current_view); }
	    } else
		if ((this->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate)) {
		const Cexpression cexpr = phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>(this->elem_patternrepresentation_1)->Cexpression_1;
		const patternrepresentation r_p = this->patternrepresentation_1;
		gl_outer_view=kc_current_view; 
		kc::unparse(r_p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") && KC_TRACE_PROVIDED(("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, view_gen_user_predicates);
		{ kc_printer(kc_t("), \""), kc_current_view); }
		kc::unparse(cexpr->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(cexpr->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this"), kc_current_view); }
	    } else
		if ((this->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const elem_patternrepresentation p = this->elem_patternrepresentation_1;
		kc::unparse(p, kc_printer, kc_current_view);
	    } else
	    {
		const elem_patternrepresentation p = this->elem_patternrepresentation_1;
		const patternrepresentation r_p = this->patternrepresentation_1;
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") && ("), kc_current_view); }
		kc::unparse(r_p, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_rw_predicates_enum: {
	    view_rw_predicates_class& kc_current_view=static_cast<view_rw_predicates_class&>(kc_current_view_base);
	    if ((this->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate) && (this->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const Cexpression cexpr = phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>(this->elem_patternrepresentation_1)->Cexpression_1;
		gl_outer_view=kc_current_view; 
			{ kc_printer(kc_t("KC_TRACE_PROVIDED(("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, view_gen_user_predicates);
		{ kc_printer(kc_t("), \""), kc_current_view); }
		kc::unparse(cexpr->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(cexpr->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this)"), kc_current_view); }
	    } else
		if ((this->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate)) {
		const Cexpression cexpr = phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>(this->elem_patternrepresentation_1)->Cexpression_1;
		const patternrepresentation r_p = this->patternrepresentation_1;
		gl_outer_view=kc_current_view; 
		kc::unparse(r_p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") && KC_TRACE_PROVIDED(("), kc_current_view); }
		kc::unparse(cexpr, kc_printer, view_gen_user_predicates);
		{ kc_printer(kc_t("), \""), kc_current_view); }
		kc::unparse(cexpr->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(cexpr->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this"), kc_current_view); }
	    } else
		if ((this->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const elem_patternrepresentation p = this->elem_patternrepresentation_1;
		kc::unparse(p, kc_printer, kc_current_view);
	    } else
	    {
		const elem_patternrepresentation p = this->elem_patternrepresentation_1;
		const patternrepresentation r_p = this->patternrepresentation_1;
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(") && ("), kc_current_view); }
		kc::unparse(r_p, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (patternrepresentation iterator_ = this; iterator_->patternrepresentation_1 != 0; iterator_ = iterator_->patternrepresentation_1)
		    iterator_->elem_patternrepresentation_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_patternrepresentation::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRIntLiteral::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->path_1->prod_sel() == sel_Conspath)) {
		const path p = this->path_1;
		const path r_p = (this->path_1)->path_1;
		const INT i = this->INT_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(r_p, kc_printer, view_gen_cast);
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")->value == "), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRStringLiteral::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->path_1->prod_sel() == sel_Conspath)) {
		const path p = this->path_1;
		const path r_p = (this->path_1)->path_1;
		const CexpressionDQ Cexprdq = this->CexpressionDQ_1;
		if ((strcmp( f_strofID( f_typeof( p ) ), "casestring" ) == 0) ||
		    (strcmp( f_strofID( f_typeof( p ) ), "nocasestring" ) == 0)) { 
		    	{ kc_printer(kc_t("kc_strcmp("), kc_current_view); }
		    kc::unparse(r_p, kc_printer, view_gen_cast);
		    kc::unparse(p, kc_printer, kc_current_view);
		    { kc_printer(kc_t("->name, kc_t(\""), kc_current_view); }
		    kc::unparse(Cexprdq, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\"))==0"), kc_current_view); }
		} else {

		    assertionFailed("String literal type neither casestring nor nocasestring");
		} 
			} else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRDefault::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("1 /*default*/"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRWildcard::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("1 /*default*/"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRNonLeafBinding::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_predicate_bindings_enum: {
	    view_predicate_bindings_class& kc_current_view=static_cast<view_predicate_bindings_class&>(kc_current_view_base);
	    if ((this->ID_1->prod_sel() == sel_Id) && (phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1->prod_sel() == sel_Str)) {
		const path p = this->path_1;
		const casestring id = phylum_cast<const impl_uniqID_Str*>(phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1)->casestring_1;
		gl_bindings[id->name]=p; 
			} else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const path p = this->path_1;
		const ID id = this->ID_1;
		{
		    ID gl_type;
		    if (this->type->eq( f_emptyId())) {
			gl_type = f_typeof( p );
		    } else {
			gl_type = this->type;
		    }   
		     if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(id->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(id->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("	const "), kc_current_view); }
		    kc::unparse(gl_type, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" = "), kc_current_view); }
		    {
			path kc_selvar_0_1 = phylum_cast<path>(p);
			if ((kc_selvar_0_1->prod_sel() == sel_Conspath)) {
			    const path r_p = (kc_selvar_0_1)->path_1;
			    r_p->unparse(kc_printer, view_gen_cast); 
			    	} else
			    if ((kc_selvar_0_1->prod_sel() == sel_Nilpath)) {

			} else
			    kc_no_default_in_with( "", __LINE__, __FILE__ );
		    }

		    kc::unparse(p, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRUserPredicate::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PROperPredicate::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_unp_predicates_enum: {
	    view_unp_predicates_class& kc_current_view=static_cast<view_unp_predicates_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Conspath) && ((this->path_1)->path_1->prod_sel() == sel_Conspath)) {
		const path p = (this->path_1)->path_1;
		const path r_p = ((this->path_1)->path_1)->path_1;
		const ID id = this->ID_1;
		kc::unparse(r_p, kc_printer, view_gen_cast);
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->prod_sel() == sel_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    } else
		if ((this->path_1->prod_sel() == sel_Nilpath)) {
	    } else
	    {
		{ kc_printer(kc_t(" true "), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->path_1->prod_sel() == sel_Conspath) && ((this->path_1)->path_1->prod_sel() == sel_Conspath)) {
		const path p = (this->path_1)->path_1;
		const path r_p = ((this->path_1)->path_1)->path_1;
		const ID id = this->ID_1;
		kc::unparse(r_p, kc_printer, view_gen_cast);
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->prod_sel() == sel_"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    } else
		if ((this->path_1->prod_sel() == sel_Nilpath)) {
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRVarPredicate::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const paths ps = this->paths_1;
		kc::unparse(ps, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_elem_patternrepresentation_PRBinding::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_predicate_bindings_enum: {
	    view_predicate_bindings_class& kc_current_view=static_cast<view_predicate_bindings_class&>(kc_current_view_base);
	    if ((this->ID_1->prod_sel() == sel_Id) && (phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1->prod_sel() == sel_Str)) {
		const path p = this->path_1;
		const casestring id = phylum_cast<const impl_uniqID_Str*>(phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1)->casestring_1;
		gl_bindings[id->name]=p; 
			} else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const path p = this->path_1;
		const ID id = this->ID_1;
		{
		    ID gl_type;
		    if (this->type->eq( f_emptyId())) {
			gl_type = f_typeof( p );
		    } else {
			gl_type = this->type;
		    }   
		     if(g_options.linedirec) 
		    {
			kc::unparse(pg_line, kc_printer, kc_current_view);
			kc::unparse(id->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" \""), kc_current_view); }
			PRINT(g_options.dir_line.c_str()); 
			kc::unparse(id->file, kc_printer, view_filename);
			{ kc_printer(kc_t("\"\n"), kc_current_view); }
		    }
		    { kc_printer(kc_t("	const "), kc_current_view); }
		    kc::unparse(gl_type, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" "), kc_current_view); }
		    kc::unparse(id, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" = "), kc_current_view); }
		    {
			path kc_selvar_0_1 = phylum_cast<path>(p);
			if ((kc_selvar_0_1->prod_sel() == sel_Conspath)) {
			    const path r_p = (kc_selvar_0_1)->path_1;
			    r_p->unparse(kc_printer, view_gen_cast); 
			    	} else
			    if ((kc_selvar_0_1->prod_sel() == sel_Nilpath)) {

			} else
			    kc_no_default_in_with( "", __LINE__, __FILE__ );
		    }

		    kc::unparse(p, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		}
	    }
	    break;
	}
    }
}

void
impl_path::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_cast_enum: {
	    view_gen_cast_class& kc_current_view=static_cast<view_gen_cast_class&>(kc_current_view_base);
	    {
		const integer i = this->integer_1;
		const path r_p = this->path_1;
		bool isnotlist = f_listelementphylum(f_phylumofoperator(this->op))->eq(f_emptyId());
		if(isnotlist)

		{
		    { kc_printer(kc_t("phylum_cast<const "), kc_current_view); }
		    kc::unparse(this->op, kc_printer, view_class_of_op);
		    { kc_printer(kc_t("*>"), kc_current_view); }
		}
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(r_p, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_rw_bindings_enum: {
	    view_rw_bindings_class& kc_current_view=static_cast<view_rw_bindings_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Nilpath)) {
		const integer i = this->integer_1;
		const path r_p = this->path_1;
		argument gl_argument = f_argumentofoperator( r_p->op, Int( i )); 
		 if (!g_options.rw_loop) 
		{
		    { kc_printer(kc_t("l_"), kc_current_view); }
		}
		kc::unparse(gl_argument, kc_printer, kc_current_view);
		gl_argument->free(false); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_unp_bindings_enum: {
	    view_unp_bindings_class& kc_current_view=static_cast<view_unp_bindings_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Nilpath)) {
		const integer i = this->integer_1;
		const path r_p = this->path_1;
		argument gl_argument = f_argumentofoperator( r_p->op, Int( i )); 
			{ kc_printer(kc_t("this->"), kc_current_view); }
		kc::unparse(gl_argument, kc_printer, kc_current_view);
		gl_argument->free(false); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_wc_bindings_enum: {
	    view_wc_bindings_class& kc_current_view=static_cast<view_wc_bindings_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Nilpath)) {
		const integer i = this->integer_1;
		ID selvar = cf_topselvar(); 
		kc::unparse(selvar, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_unp_predicates_enum: {
	    view_unp_predicates_class& kc_current_view=static_cast<view_unp_predicates_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Nilpath)) {
		const integer i = this->integer_1;
		const path r_p = this->path_1;
		argument gl_argument = f_argumentofoperator( r_p->op, Int( i )); 
			{ kc_printer(kc_t("this->"), kc_current_view); }
		kc::unparse(gl_argument, kc_printer, kc_current_view);
		gl_argument->free(false); 
			} else
		    goto kc_unparsing_default;
	    break;
	}
	case view_wc_predicates_enum: {
	    view_wc_predicates_class& kc_current_view=static_cast<view_wc_predicates_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Nilpath)) {
		const integer i = this->integer_1;
		ID selvar = cf_topselvar(); 
		kc::unparse(selvar, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_"), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_rw_predicates_enum: {
	    view_rw_predicates_class& kc_current_view=static_cast<view_rw_predicates_class&>(kc_current_view_base);
	    if ((this->path_1->prod_sel() == sel_Nilpath)) {
		const integer i = this->integer_1;
		const path r_p = this->path_1;
		argument gl_argument = f_argumentofoperator( r_p->op, Int( i )); 
		 if (!g_options.rw_loop) 
		{
		    { kc_printer(kc_t("l_"), kc_current_view); }
		}
		kc::unparse(gl_argument, kc_printer, kc_current_view);
		gl_argument->free(false); 
			} else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const integer i = this->integer_1;
		const path r_p = this->path_1;
		kc::unparse(r_p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")->"), kc_current_view); }
		argument gl_argument = f_argumentofoperator( r_p->op, Int( i )); 
		kc::unparse(gl_argument, kc_printer, kc_current_view);
		gl_argument->free(false); 
	    }
	    break;
	}
    }
}

void
impl_path::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_rw_bindings_enum: {
	    view_rw_bindings_class& kc_current_view=static_cast<view_rw_bindings_class&>(kc_current_view_base);
	    {
		if (gl_args->is_nil() || g_options.rw_loop) 
		{
		    { kc_printer(kc_t("this"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("((("), kc_current_view); }
		    kc::unparse(gl_args, kc_printer, view_gen_rewritedefs_dotestarg_c);
		    { kc_printer(kc_t(")) ? this : "), kc_current_view); }
		    kc::unparse(gl_operator, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(gl_args, kc_printer, view_gen_rewritedefs_args_c);
		    { kc_printer(kc_t("))"), kc_current_view); }
		}
	    }
	    break;
	}
	case view_unp_bindings_enum: {
	    view_unp_bindings_class& kc_current_view=static_cast<view_unp_bindings_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("this/**/"), kc_current_view); }
	    }
	    break;
	}
	case view_unp_predicates_enum: {
	    view_unp_predicates_class& kc_current_view=static_cast<view_unp_predicates_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("this/**/"), kc_current_view); }
	    }
	    break;
	}
	case view_rw_predicates_enum: {
	    view_rw_predicates_class& kc_current_view=static_cast<view_rw_predicates_class&>(kc_current_view_base);
	    {
		if (gl_args->is_nil() || g_options.rw_loop) 
		{
		    { kc_printer(kc_t("this"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("((("), kc_current_view); }
		    kc::unparse(gl_args, kc_printer, view_gen_rewritedefs_dotestarg_c);
		    { kc_printer(kc_t(")) ? this : "), kc_current_view); }
		    kc::unparse(gl_operator, kc_printer, kc_current_view);
		    { kc_printer(kc_t("("), kc_current_view); }
		    kc::unparse(gl_args, kc_printer, view_gen_rewritedefs_args_c);
		    { kc_printer(kc_t("))"), kc_current_view); }
		}
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}

void
impl_paths::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->path_1->prod_sel() == sel_Conspath) && (this->paths_1->prod_sel() == sel_Conspaths) && ((this->paths_1)->path_1->prod_sel() == sel_Conspath) && ((this->paths_1)->paths_1->prod_sel() == sel_Nilpaths)) {
		const path p1 = this->path_1;
		const path r_p1 = (this->path_1)->path_1;
		const path p2 = (this->paths_1)->path_1;
		const path r_p2 = ((this->paths_1)->path_1)->path_1;
		kc::unparse(r_p1, kc_printer, view_gen_cast);
		kc::unparse(p1, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->eq("), kc_current_view); }
		kc::unparse(r_p2, kc_printer, view_gen_cast);
		kc::unparse(p2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    } else
		if ((this->path_1->prod_sel() == sel_Conspath) && (this->paths_1->prod_sel() == sel_Conspaths) && ((this->paths_1)->path_1->prod_sel() == sel_Conspath)) {
		const path p1 = this->path_1;
		const path r_p1 = (this->path_1)->path_1;
		const paths pp1 = this->paths_1;
		const path p2 = (this->paths_1)->path_1;
		const path r_p2 = ((this->paths_1)->path_1)->path_1;
		kc::unparse(r_p1, kc_printer, view_gen_cast);
		kc::unparse(p1, kc_printer, kc_current_view);
		{ kc_printer(kc_t("->eq("), kc_current_view); }
		kc::unparse(r_p2, kc_printer, view_gen_cast);
		kc::unparse(p2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")) && ("), kc_current_view); }
		kc::unparse(pp1, kc_printer, kc_current_view);
	    } else
		if ((this->paths_1->prod_sel() == sel_Nilpaths)) {
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		path_1->unparse(kc_printer, kc_current_view );
		paths_1->do_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_paths::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}

void
impl_argsnumbers::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_rewritek_c_enum: {
	    view_gen_rewritek_c_class& kc_current_view=static_cast<view_gen_rewritek_c_class&>(kc_current_view_base);
	    {
		const integer i = this->integer_1;
		const argsnumbers r = this->argsnumbers_1;
		{ kc_printer(kc_t("   case "), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": return kc_create(kc_op"), kc_current_view); }
		for (int j=0; j<i->value; ++j) 
		{
		    { kc_printer(kc_t(", sons[son_offset"), kc_current_view); }
		    if (j!=0) 
		    {
			{ kc_printer(kc_t("+"), kc_current_view); }
			kc::unparse(j, kc_printer, kc_current_view);
		    }
		    { kc_printer(kc_t("]"), kc_current_view); }
		}
		{ kc_printer(kc_t(");\
\n"), kc_current_view); }
		kc::unparse(r, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_copydefs_c_enum: {
	    view_gen_copydefs_c_class& kc_current_view=static_cast<view_gen_copydefs_c_class&>(kc_current_view_base);
	    {
		const integer i = this->integer_1;
		const argsnumbers r = this->argsnumbers_1;
		{ kc_printer(kc_t("   case "), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": kc_answer = kc_create(prod_sel()"), kc_current_view); }
		for (int j=0; j<i->value; ++j) 
		{
		    { kc_printer(kc_t(", kc_subtmp["), kc_current_view); }
		    kc::unparse(j, kc_printer, kc_current_view);
		    { kc_printer(kc_t("]"), kc_current_view); }
		}
		{ kc_printer(kc_t("); break;\
\n"), kc_current_view); }
		kc::unparse(r, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_csgio_c_enum: {
	    view_gen_csgio_c_class& kc_current_view=static_cast<view_gen_csgio_c_class&>(kc_current_view_base);
	    {
		const integer i = this->integer_1;
		const argsnumbers r = this->argsnumbers_1;
		{ kc_printer(kc_t("   case "), kc_current_view); }
		kc::unparse(i, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": kc_answer = kc_create(kc_op"), kc_current_view); }
		for (int j=0; j<i->value; ++j) 
		{
		    { kc_printer(kc_t(", kc_subtmp["), kc_current_view); }
		    kc::unparse(j, kc_printer, kc_current_view);
		    { kc_printer(kc_t("]"), kc_current_view); }
		}
		{ kc_printer(kc_t("); break;\
\n"), kc_current_view); }
		kc::unparse(r, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (argsnumbers iterator_ = this; iterator_->argsnumbers_1 != 0; iterator_ = iterator_->argsnumbers_1)
		    iterator_->integer_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_argsnumbers::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_rewritek_c_enum: {
	    view_gen_rewritek_c_class& kc_current_view=static_cast<view_gen_rewritek_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_copydefs_c_enum: {
	    view_gen_copydefs_c_class& kc_current_view=static_cast<view_gen_copydefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_csgio_c_enum: {
	    view_gen_csgio_c_class& kc_current_view=static_cast<view_gen_csgio_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_rewriterulesinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_rewritedefs_other_c_enum: {
	    view_gen_rewritedefs_other_c_class& kc_current_view=static_cast<view_gen_rewritedefs_other_c_class&>(kc_current_view_base);
	    if ((this->rewriteruleinfo_1->prod_sel() == sel_Rewriteruleinfo) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && ((phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1->prod_sel() == sel_RewriteClause)) {
		const elem_patternrepresentation rep = (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_2;
		const term t = phylum_cast<const impl_rewriteclause_RewriteClause*>(phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1)->term_1;
		const rewriterulesinfo r_rri = this->rewriterulesinfo_1;
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(rep->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(rep->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	{ KC_TRACE_REWRITE_MATCH(kc_current_view, \""), kc_current_view); }
		kc::unparse(rep->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(rep->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this);\
\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_rw_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(t->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		if(g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_result = "), kc_current_view); }
		    kc::unparse(t, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		    kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		    { kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
		    kc::unparse(t->file, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\","), kc_current_view); }
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(",kc_result);\
\n	return kc_result;\
\n"), kc_current_view); }
		}
		else 
		{
		    if(g_options.smart_pointer) 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_ptr kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (kc_result() == this ? this : kc_result->rewrite( kc_current_view_base ))->return_ptr();\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (const_cast<const impl_"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );\
\n"), kc_current_view); }
		    }
		}
		{ kc_printer(kc_t("\
\n	}\
\n"), kc_current_view); }
		if (g_options.warn_drop_identical_patterns) {
		    rewriterulesinfo kc_selvar_0_1 = phylum_cast<rewriterulesinfo>(r_rri);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consrewriterulesinfo)) {

			{
			    rewriterulesinfo kc_fe_selvar_1 =  kc_selvar_0_1;

			    while(
				    kc_fe_selvar_1->prod_sel() == sel_Consrewriterulesinfo
				) {
				rewriteruleinfo kc_selvar_1_1 = kc_fe_selvar_1->rewriteruleinfo_1;
				{
				    {
					{
					    const rewriteruleinfo rri = kc_selvar_1_1;

					    warn_drop_identical_pattern(rri);

					}
				    }

				}
				kc_fe_selvar_1 = kc_fe_selvar_1->rewriterulesinfo_1;

			    }
			}

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Nilrewriterulesinfo)) {

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    } else
		if ((this->rewriteruleinfo_1->prod_sel() == sel_Rewriteruleinfo) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1->prod_sel() == sel_RewriteClause)) {
		const patternrepresentation bindings = phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_2;
		const term t = phylum_cast<const impl_rewriteclause_RewriteClause*>(phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1)->term_1;
		assertionFailed("Completely empty rewrite pattern not possible."); 
			} else
		if ((this->rewriteruleinfo_1->prod_sel() == sel_Rewriteruleinfo) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1->prod_sel() == sel_RewriteClause)) {
		const elem_patternrepresentation rep = (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1;
		const patternrepresentation r_p = (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_2;
		const term t = phylum_cast<const impl_rewriteclause_RewriteClause*>(phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1)->term_1;
		const rewriterulesinfo r_rri = this->rewriterulesinfo_1;
		gl_bindings.clear(); 
		kc::unparse(bindings, kc_printer, view_predicate_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(rep->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(rep->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	if (("), kc_current_view); }
		kc::unparse(r_p, kc_printer, view_rw_predicates);
		{ kc_printer(kc_t(")) { KC_TRACE_REWRITE_MATCH(kc_current_view, \""), kc_current_view); }
		kc::unparse(rep->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(rep->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this);\
\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_rw_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(t->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		if(g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_result = "), kc_current_view); }
		    kc::unparse(t, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		    kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		    { kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
		    kc::unparse(t->file, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\","), kc_current_view); }
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(",kc_result);\
\n	return kc_result;\
\n"), kc_current_view); }
		}
		else 
		{
		    if(g_options.smart_pointer) 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_ptr kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (kc_result() == this ? this : kc_result->rewrite( kc_current_view_base ))->return_ptr();\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (const_cast<const impl_"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );\
\n"), kc_current_view); }
		    }
		}
		{ kc_printer(kc_t("\
\n	} else\
\n"), kc_current_view); }
		kc::unparse(r_rri, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_rewritedefs_default_c_enum: {
	    view_gen_rewritedefs_default_c_class& kc_current_view=static_cast<view_gen_rewritedefs_default_c_class&>(kc_current_view_base);
	    if ((this->rewriteruleinfo_1->prod_sel() == sel_Rewriteruleinfo) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && ((phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1->prod_sel() == sel_RewriteClause)) {
		const elem_patternrepresentation rep = (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_2;
		const term t = phylum_cast<const impl_rewriteclause_RewriteClause*>(phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1)->term_1;
		const rewriterulesinfo r_rri = this->rewriterulesinfo_1;
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(rep->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(rep->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	{ KC_TRACE_REWRITE_MATCH(kc_current_view, \""), kc_current_view); }
		kc::unparse(rep->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(rep->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this);\
\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_rw_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(t->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		if(g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_result = "), kc_current_view); }
		    kc::unparse(t, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		    kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		    { kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
		    kc::unparse(t->file, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\","), kc_current_view); }
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(",kc_result);\
\n	return kc_result;\
\n"), kc_current_view); }
		}
		else 
		{
		    if(g_options.smart_pointer) 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_ptr kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (kc_result() == this ? this : kc_result->rewrite( kc_current_view_base ))->return_ptr();\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (const_cast<const impl_"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );\
\n"), kc_current_view); }
		    }
		}
		{ kc_printer(kc_t("\
\n	}\
\n"), kc_current_view); }
		if (g_options.warn_drop_identical_patterns) {
		    rewriterulesinfo kc_selvar_0_1 = phylum_cast<rewriterulesinfo>(r_rri);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consrewriterulesinfo)) {

			{
			    rewriterulesinfo kc_fe_selvar_1 =  kc_selvar_0_1;

			    while(
				    kc_fe_selvar_1->prod_sel() == sel_Consrewriterulesinfo
				) {
				rewriteruleinfo kc_selvar_1_1 = kc_fe_selvar_1->rewriteruleinfo_1;
				{
				    {
					{
					    const rewriteruleinfo rri = kc_selvar_1_1;

					    warn_drop_identical_pattern(rri);

					}
				    }

				}
				kc_fe_selvar_1 = kc_fe_selvar_1->rewriterulesinfo_1;

			    }
			}

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Nilrewriterulesinfo)) {

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    } else
		if ((this->rewriteruleinfo_1->prod_sel() == sel_Rewriteruleinfo) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1->prod_sel() == sel_RewriteClause)) {
		const patternrepresentation bindings = phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_2;
		const term t = phylum_cast<const impl_rewriteclause_RewriteClause*>(phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1)->term_1;
		assertionFailed("Completely empty rewrite pattern not possible."); 
			} else
		if ((this->rewriteruleinfo_1->prod_sel() == sel_Rewriteruleinfo) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1->prod_sel() == sel_RewriteClause)) {
		const elem_patternrepresentation rep = (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1;
		const patternrepresentation r_p = (phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->patternrepresentation_2;
		const term t = phylum_cast<const impl_rewriteclause_RewriteClause*>(phylum_cast<const impl_rewriteruleinfo_Rewriteruleinfo*>(this->rewriteruleinfo_1)->rewriteclause_1)->term_1;
		const rewriterulesinfo r_rri = this->rewriterulesinfo_1;
		gl_bindings.clear(); 
		kc::unparse(bindings, kc_printer, view_predicate_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(rep->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(rep->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	if (("), kc_current_view); }
		kc::unparse(r_p, kc_printer, view_rw_predicates);
		{ kc_printer(kc_t(")) { KC_TRACE_REWRITE_MATCH(kc_current_view, \""), kc_current_view); }
		kc::unparse(rep->file, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\", "), kc_current_view); }
		kc::unparse(rep->line, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", this);\
\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_rw_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(t->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		if(g_options.rw_loop) 
		{
		    { kc_printer(kc_t("	"), kc_current_view); }
		    kc::unparse(gl_phylum, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" kc_result = "), kc_current_view); }
		    kc::unparse(t, kc_printer, kc_current_view);
		    { kc_printer(kc_t(";\
\n"), kc_current_view); }
		    kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		    { kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
		    kc::unparse(t->file, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\","), kc_current_view); }
		    kc::unparse(t->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(",kc_result);\
\n	return kc_result;\
\n"), kc_current_view); }
		}
		else 
		{
		    if(g_options.smart_pointer) 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("_ptr kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (kc_result() == this ? this : kc_result->rewrite( kc_current_view_base ))->return_ptr();\
\n"), kc_current_view); }
		    }
		    else 
		    {
			{ kc_printer(kc_t("	"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t(" kc_result = "), kc_current_view); }
			kc::unparse(t, kc_printer, kc_current_view);
			{ kc_printer(kc_t(";\
\n"), kc_current_view); }
			kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
			{ kc_printer(kc_t("	KC_TRACE_REWRITE_RESULT(kc_current_view,\""), kc_current_view); }
			kc::unparse(t->file, kc_printer, kc_current_view);
			{ kc_printer(kc_t("\","), kc_current_view); }
			kc::unparse(t->line, kc_printer, kc_current_view);
			{ kc_printer(kc_t(",kc_result);\
\n	return (const_cast<const impl_"), kc_current_view); }
			kc::unparse(gl_phylum, kc_printer, kc_current_view);
			{ kc_printer(kc_t("*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );\
\n"), kc_current_view); }
		    }
		}
		{ kc_printer(kc_t("\
\n	} else\
\n"), kc_current_view); }
		kc::unparse(r_rri, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (rewriterulesinfo iterator_ = this; iterator_->rewriterulesinfo_1 != 0; iterator_ = iterator_->rewriterulesinfo_1)
		    iterator_->rewriteruleinfo_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_rewriterulesinfo::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_rewritedefs_other_c_enum: {
	    view_gen_rewritedefs_other_c_class& kc_current_view=static_cast<view_gen_rewritedefs_other_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\vgoto kc_rewrite_default\r;\
\n"), kc_current_view); }
		gl_rewrite_goto_used = true; 
	    }
	    break;
	}
	case view_gen_rewritedefs_default_c_enum: {
	    view_gen_rewritedefs_default_c_class& kc_current_view=static_cast<view_gen_rewritedefs_default_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("break;"), kc_current_view); }
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_rewriteruleinfo_Rewriteruleinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_withcasesinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->withcaseinfo_1->prod_sel() == sel_Withcaseinfo) && (phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && ((phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1->prod_sel() == sel_PRUserPredicate) && (phylum_cast<const impl_elem_patternrepresentation_PRUserPredicate*>((phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1)->Cexpression_1->prod_sel() == sel_NilCexpression)) {
		const patternrepresentation bindings = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_2;
		const Ctext ct = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->Ctext_1;
		{ kc_printer(kc_t("{\
\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(bindings, kc_printer, view_wc_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
	    } else
		if ((this->withcaseinfo_1->prod_sel() == sel_Withcaseinfo) && (phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && ((phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1)->elem_patternrepresentation_1->prod_sel() == sel_PRDefault)) {
		const patternrepresentation bindings = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_2;
		const Ctext ct = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->Ctext_1;
		{ kc_printer(kc_t("{\
\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(bindings, kc_printer, view_wc_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
	    } else
		if ((this->withcaseinfo_1->prod_sel() == sel_Withcaseinfo) && (phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const patternrepresentation bindings = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_2;
		const Ctext ct = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->Ctext_1;
		{ kc_printer(kc_t("{\
\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(bindings, kc_printer, view_wc_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("}\
\n"), kc_current_view); }
	    } else
		if ((this->withcaseinfo_1->prod_sel() == sel_Withcaseinfo)) {
		const patternrepresentation p = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->patternrepresentation_2;
		const Ctext ct = phylum_cast<const impl_withcaseinfo_Withcaseinfo*>(this->withcaseinfo_1)->Ctext_1;
		const withcasesinfo r_rri = this->withcasesinfo_1;
		gl_bindings.clear(); 
		kc::unparse(bindings, kc_printer, view_predicate_bindings);
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("	if (("), kc_current_view); }
		kc::unparse(p, kc_printer, view_wc_predicates);
		{ kc_printer(kc_t(")) {\
\n"), kc_current_view); }
		if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(bindings, kc_printer, view_wc_bindings);
		operatorstack.push( f_operatorofpatternrepresentation( p ) ); 
		 if(g_options.linedirec) 
		{
		    kc::unparse(pg_line, kc_printer, kc_current_view);
		    kc::unparse(ct->line, kc_printer, kc_current_view);
		    { kc_printer(kc_t(" \""), kc_current_view); }
		    PRINT(g_options.dir_line.c_str()); 
		    kc::unparse(ct->file, kc_printer, view_filename);
		    { kc_printer(kc_t("\"\n"), kc_current_view); }
		}
		kc::unparse(ct, kc_printer, view_gen_initializephyla_c);
		operatorstack.pop(); 
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("	} else\
\n"), kc_current_view); }
		kc::unparse(r_rri, kc_printer, kc_current_view);
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		withcaseinfo_1->unparse(kc_printer, kc_current_view );
		withcasesinfo_1->do_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_withcasesinfo::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_withcases_and_default_enum: {
	    view_gen_withcases_and_default_class& kc_current_view=static_cast<view_gen_withcases_and_default_class&>(kc_current_view_base);
	    {
		if (inforeachcontext.top()) 
		{
		    { kc_printer(kc_t("{/* EMPTY */ /*skip: no matching pattern in foreach patterns*/}\
\n"), kc_current_view); }
		}
		else if ( (strcmp( gl_return_type, "" ) == 0) ||
		    ((gl_star_count == 0) &&
			(! f_isphylum( gl_return_ID )) &&
			(! f_is_known_ptr_type( gl_return_ID )) ) ) 
		{
		    { kc_printer(kc_t("kc_no_default_in_with( \""), kc_current_view); }
		    kc::unparse(gl_function, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\", __LINE__, __FILE__ );\
\n"), kc_current_view); }
		}
		else 
		{
		    { kc_printer(kc_t("{ kc_no_default_in_with( \""), kc_current_view); }
		    kc::unparse(gl_function, kc_printer, kc_current_view);
		    { kc_printer(kc_t("\", __LINE__, __FILE__ );\
\n   return static_cast<"), kc_current_view); }
		    kc::unparse(gl_return_type, kc_printer, kc_current_view);
		    charruns star_string = Stars()->set(gl_star_count); 
		    kc::unparse(star_string, kc_printer, kc_current_view);
		    { kc_printer(kc_t(">(0); }\
\n"), kc_current_view); }
		}
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_withcaseinfo_Withcaseinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_rewriteviewsinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
		const rewriteviewinfo a_rvi = this->rewriteviewinfo_1;
		const rewriteviewsinfo r_rvi = this->rewriteviewsinfo_1;
		kc::unparse(r_rvi, kc_printer, kc_current_view);
		kc::unparse(a_rvi, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (rewriteviewsinfo iterator_ = this; iterator_->rewriteviewsinfo_1 != 0; iterator_ = iterator_->rewriteviewsinfo_1)
		    iterator_->rewriteviewinfo_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_rewriteviewsinfo::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_rewriteviewinfo_Rewriteviewinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_rewritedefs_other_c_enum: {
	    view_gen_rewritedefs_other_c_class& kc_current_view=static_cast<view_gen_rewritedefs_other_c_class&>(kc_current_view_base);
	    if ((this->rewriterulesinfo_1->prod_sel() == sel_Nilrewriterulesinfo)) {
	    } else
	    {
		const ID v = this->ID_1;
		{ kc_printer(kc_t("    case "), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_enum: {\
\n		"), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class& kc_current_view=static_cast<"), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class&>(kc_current_view_base);\
\n"), kc_current_view); }
		gl_view = v; 
		kc::unparse(gl_alternative, kc_printer, kc_current_view);
		gl_view = 0; 
			{ kc_printer(kc_t("    }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedefs_default_c_enum: {
	    view_gen_rewritedefs_default_c_class& kc_current_view=static_cast<view_gen_rewritedefs_default_c_class&>(kc_current_view_base);
	    if ((this->rewriterulesinfo_1->prod_sel() == sel_Nilrewriterulesinfo)) {
		if (gl_rewrite_goto_used) 
		{
		    { kc_printer(kc_t("    kc_rewrite_default:\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    default:;\
\n"), kc_current_view); }
	    } else
	    {
		const ID v = this->ID_1;
		{ kc_printer(kc_t("    default:\
\n"), kc_current_view); }
		if (gl_rewrite_goto_used) 
		{
		    { kc_printer(kc_t("    kc_rewrite_default:\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    case "), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_enum: {\
\n		"), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class& kc_current_view=static_cast<"), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class&>(kc_current_view_base);\
\n"), kc_current_view); }
		gl_view = v; 
		kc::unparse(gl_alternative, kc_printer, kc_current_view);
		gl_view = 0; 
			{ kc_printer(kc_t("    }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_rewritedefs_c_enum: {
	    view_gen_rewritedefs_c_class& kc_current_view=static_cast<view_gen_rewritedefs_c_class&>(kc_current_view_base);
	    if ((this->ID_1->prod_sel() == sel_Id) && (phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1->prod_sel() == sel_Str)) {
		const casestring v = phylum_cast<const impl_uniqID_Str*>(phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1)->casestring_1;
		const rewriterulesinfo rri = this->rewriterulesinfo_1;
		gl_rewrite_rewriteinfo = rri; 
		 if ( strcmp(v->name, "base_rview" )==0 ) 
		{
		    kc::unparse(this, kc_printer, view_gen_rewritedefs_default_c);
		}
		else 
		{
		    kc::unparse(this, kc_printer, view_gen_rewritedefs_other_c);
		}
		gl_rewrite_rewriteinfo = 0; 
			} else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_unparseviewsinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
		const unparseviewinfo a_uvi = this->unparseviewinfo_1;
		const unparseviewsinfo r_uvi = this->unparseviewsinfo_1;
		kc::unparse(r_uvi, kc_printer, kc_current_view);
		kc::unparse(a_uvi, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (unparseviewsinfo iterator_ = this; iterator_->unparseviewsinfo_1 != 0; iterator_ = iterator_->unparseviewsinfo_1)
		    iterator_->unparseviewinfo_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_unparseviewsinfo::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_unparseviewinfo_Unparseviewinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    if ((this->unparsedeclsinfo_1->prod_sel() == sel_Nilunparsedeclsinfo)) {
	    } else
	    {
		const ID v = this->ID_1;
		const unparsedeclsinfo udi = this->unparsedeclsinfo_1;
		{ kc_printer(kc_t("    case "), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_enum: {\
\n		"), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class& kc_current_view=static_cast<"), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_class&>(kc_current_view_base);\
\n"), kc_current_view); }
		kc::unparse(udi, kc_printer, kc_current_view);
		{ kc_printer(kc_t("	break;\
\n    }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		const ID v = this->ID_1;
		const unparsedeclsinfo udi = this->unparsedeclsinfo_1;
		kc::unparse(g_emptystring, kc_printer, view_printer_outputfileline);
		{ kc_printer(kc_t("    default:\
\n"), kc_current_view); }
		if (gl_unparse_goto_used) 
		{
		    { kc_printer(kc_t("    kc_unparsing_default:\
\n"), kc_current_view); }
		}
		{ kc_printer(kc_t("    case "), kc_current_view); }
		kc::unparse(v, kc_printer, kc_current_view);
		{ kc_printer(kc_t("_enum: {\
\n		uview kc_current_view=kc_current_view_base;\
\n"), kc_current_view); }
		bool onlyDefault;
		{
		    unparsedeclsinfo kc_selvar_0_1 = phylum_cast<unparsedeclsinfo>(udi);
		    if ((kc_selvar_0_1->prod_sel() == sel_Nilunparsedeclsinfo)) {
			onlyDefault = true; 
				} else
		    {
			onlyDefault = false; 
		    }
		}

		view_gen_unparsedefs_default_c_class vgudcD(/* is list ? */ false, onlyDefault);
		kc::unparse(udi, kc_printer, vgudcD);
		{ kc_printer(kc_t("	break;\
\n    }\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_unparsedefs_c_enum: {
	    view_gen_unparsedefs_c_class& kc_current_view=static_cast<view_gen_unparsedefs_c_class&>(kc_current_view_base);
	    if ((this->ID_1->prod_sel() == sel_Id) && (phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1->prod_sel() == sel_Str)) {
		const casestring v = phylum_cast<const impl_uniqID_Str*>(phylum_cast<const impl_ID_Id*>(this->ID_1)->uniqID_1)->casestring_1;
		if ( strcmp(v->name, "base_uview" )==0 ) 
		{
		    kc::unparse(this, kc_printer, view_gen_unparsedefs_default_c);
		}
		else 
		{
		    kc::unparse(this, kc_printer, view_gen_unparsedefs_other_c);
		}
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_unparsedeclsinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    if ((this->unparsedeclinfo_1->prod_sel() == sel_Unparsedeclinfo) && (phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && ((phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const patternrepresentation p = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_2;
		const unparseclause uc = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->unparseclause_1;
		const unparsedeclsinfo r_udi = this->unparsedeclsinfo_1;
		{ kc_printer(kc_t("{\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_unp_bindings);
		operatorstack.push( f_operatorofpatternrepresentation( p ) ); 
		kc::unparse(uc, kc_printer, kc_current_view);
		operatorstack.pop(); 
			{ kc_printer(kc_t("}\
\n"), kc_current_view); }
		if (g_options.warn_drop_identical_patterns) {
		    unparsedeclsinfo kc_selvar_0_1 = phylum_cast<unparsedeclsinfo>(r_udi);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consunparsedeclsinfo)) {

			{
			    unparsedeclsinfo kc_fe_selvar_1 =  kc_selvar_0_1;

			    while(
				    kc_fe_selvar_1->prod_sel() == sel_Consunparsedeclsinfo
				) {
				unparsedeclinfo kc_selvar_1_1 = kc_fe_selvar_1->unparsedeclinfo_1;
				{
				    {
					{
					    const unparsedeclinfo udi = kc_selvar_1_1;

					    warn_drop_identical_pattern(udi);

					}
				    }

				}
				kc_fe_selvar_1 = kc_fe_selvar_1->unparsedeclsinfo_1;

			    }
			}

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Nilunparsedeclsinfo)) {

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    } else
		if ((this->unparsedeclinfo_1->prod_sel() == sel_Unparsedeclinfo) && (phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation)) {
		const patternrepresentation p = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1;
		const patternrepresentation r_p = (phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_2;
		const unparseclause uc = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->unparseclause_1;
		const unparsedeclsinfo r_udi = this->unparsedeclsinfo_1;
		gl_bindings.clear(); 
		kc::unparse(bindings, kc_printer, view_predicate_bindings);
		{ kc_printer(kc_t("	if (("), kc_current_view); }
		kc::unparse(r_p, kc_printer, view_unp_predicates);
		{ kc_printer(kc_t(")) {\
\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_unp_bindings);
		operatorstack.push( f_operatorofpatternrepresentation( p ) ); 
		kc::unparse(uc, kc_printer, kc_current_view);
		operatorstack.pop(); 
			{ kc_printer(kc_t("	} else\
\n"), kc_current_view); }
		kc::unparse(r_udi, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    if ((this->unparsedeclinfo_1->prod_sel() == sel_Unparsedeclinfo) && (phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation) && ((phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1)->patternrepresentation_1->prod_sel() == sel_Nilpatternrepresentation)) {
		const patternrepresentation p = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_2;
		const unparseclause uc = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->unparseclause_1;
		const unparsedeclsinfo r_udi = this->unparsedeclsinfo_1;
		{ kc_printer(kc_t("{\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_unp_bindings);
		operatorstack.push( f_operatorofpatternrepresentation( p ) ); 
		kc::unparse(uc, kc_printer, kc_current_view);
		operatorstack.pop(); 
			{ kc_printer(kc_t("}\
\n"), kc_current_view); }
		if (g_options.warn_drop_identical_patterns) {
		    unparsedeclsinfo kc_selvar_0_1 = phylum_cast<unparsedeclsinfo>(r_udi);
		    if ((kc_selvar_0_1->prod_sel() == sel_Consunparsedeclsinfo)) {

			{
			    unparsedeclsinfo kc_fe_selvar_1 =  kc_selvar_0_1;

			    while(
				    kc_fe_selvar_1->prod_sel() == sel_Consunparsedeclsinfo
				) {
				unparsedeclinfo kc_selvar_1_1 = kc_fe_selvar_1->unparsedeclinfo_1;
				{
				    {
					{
					    const unparsedeclinfo udi = kc_selvar_1_1;

					    warn_drop_identical_pattern(udi);

					}
				    }

				}
				kc_fe_selvar_1 = kc_fe_selvar_1->unparsedeclsinfo_1;

			    }
			}

		    } else
			if ((kc_selvar_0_1->prod_sel() == sel_Nilunparsedeclsinfo)) {

		    } else
			kc_no_default_in_with( "", __LINE__, __FILE__ );
		}

	    } else
		if ((this->unparsedeclinfo_1->prod_sel() == sel_Unparsedeclinfo) && (phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1->prod_sel() == sel_Conspatternrepresentation)) {
		const patternrepresentation p = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1;
		const patternrepresentation r_p = (phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_1)->patternrepresentation_1;
		const patternrepresentation bindings = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->patternrepresentation_2;
		const unparseclause uc = phylum_cast<const impl_unparsedeclinfo_Unparsedeclinfo*>(this->unparsedeclinfo_1)->unparseclause_1;
		const unparsedeclsinfo r_udi = this->unparsedeclsinfo_1;
		gl_bindings.clear(); 
		kc::unparse(bindings, kc_printer, view_predicate_bindings);
		{ kc_printer(kc_t("	if (("), kc_current_view); }
		kc::unparse(r_p, kc_printer, view_unp_predicates);
		{ kc_printer(kc_t(")) {\
\n"), kc_current_view); }
		kc::unparse(bindings, kc_printer, view_unp_bindings);
		operatorstack.push( f_operatorofpatternrepresentation( p ) ); 
		kc::unparse(uc, kc_printer, kc_current_view);
		operatorstack.pop(); 
			{ kc_printer(kc_t("	} else\
\n"), kc_current_view); }
		kc::unparse(r_udi, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (unparsedeclsinfo iterator_ = this; iterator_->unparsedeclsinfo_1 != 0; iterator_ = iterator_->unparsedeclsinfo_1)
		    iterator_->unparsedeclinfo_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_unparsedeclsinfo::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_unparsedefs_other_c_enum: {
	    view_gen_unparsedefs_other_c_class& kc_current_view=static_cast<view_gen_unparsedefs_other_c_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("\vgoto kc_unparsing_default\r;\
\n"), kc_current_view); }
		gl_unparse_goto_used = true; 
	    }
	    break;
	}
	case view_gen_unparsedefs_default_c_enum: {
	    view_gen_unparsedefs_default_c_class& kc_current_view=static_cast<view_gen_unparsedefs_default_c_class&>(kc_current_view_base);
	    {
		phylumdeclaration phydecl = f_lookupdecl( gl_phylum );
		if ( phydecl == 0 ) 
		{

		    v_report(NonFatal( FileLine( gl_phylum->file, gl_phylum->line ), Problem1S1ID( "internal error: could not find declaration of phylum:", gl_phylum )));

		}
		else 
		{
		    kc::unparse(phydecl, kc_printer, kc_current_view);
		}
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_unparsedeclinfo_Unparsedeclinfo::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_declaration_AcDeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_init_declarator_list idlo = this->ac_init_declarator_list_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(idlo, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
    }
}

void
impl_ac_declaration_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_declaration h = this->ac_declaration_1;
		const ac_declaration_list t = this->ac_declaration_list_1;
		kc::unparse(t, kc_printer, kc_current_view);
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_declaration_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_ac_declaration_specifiers::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_declaration_specifiers_1->prod_sel() == sel_Nilac_declaration_specifiers)) {
		const ac_declaration_specifier h = this->ac_declaration_specifier_1;
		kc::unparse(h, kc_printer, kc_current_view);
	    } else
	    {
		const ac_declaration_specifier h = this->ac_declaration_specifier_1;
		const ac_declaration_specifiers t = this->ac_declaration_specifiers_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_declaration_specifiers::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_declaration_specifier_AcDeclSpecTypeQual::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_declaration_specifier_AcDeclSpecTypeSpec::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_declaration_specifier_AcDeclSpecStorageSpec::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_storage_class_specifier_AcVirtual::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("virtual"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_storage_class_specifier_AcTypedef::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("typedef"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_storage_class_specifier_AcExtern::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("extern"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_storage_class_specifier_AcStatic::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("static"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_storage_class_specifier_AcRegister::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("register"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_storage_class_specifier_AcAuto::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("auto"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_type_specifier_AcTypeSpec::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ID i = this->ID_1;
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_type_qualifier_AcNoQualifier::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_type_qualifier_AcUnsigned::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("unsigned"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_type_qualifier_AcVolatile::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("volatile"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_type_qualifier_AcConst::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("const"), kc_current_view); }
	    }
	    break;
	}
    }
}

void
impl_ac_init_declarator_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_init_declarator_list_1->prod_sel() == sel_Nilac_init_declarator_list)) {
		const ac_init_declarator h = this->ac_init_declarator_1;
		kc::unparse(h, kc_printer, kc_current_view);
	    } else
	    {
		const ac_init_declarator h = this->ac_init_declarator_1;
		const ac_init_declarator_list t = this->ac_init_declarator_list_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_init_declarator_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_init_declarator_AcInitDecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(d, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_declarator_AcDeclarator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_opt_const_enum: {
	    view_gen_opt_const_class& kc_current_view=static_cast<view_gen_opt_const_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_pointer_option po = this->ac_pointer_option_1;
		const ac_ref_option rr = this->ac_ref_option_1;
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(po, kc_printer, kc_current_view);
		kc::unparse(rr, kc_printer, kc_current_view);
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fn_pointer_name_enum: {
	    view_gen_fn_pointer_name_class& kc_current_view=static_cast<view_gen_fn_pointer_name_class&>(kc_current_view_base);
	    {
		const ac_pointer_option po = this->ac_pointer_option_1;
		const ac_ref_option rr = this->ac_ref_option_1;
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(po, kc_printer, kc_current_view);
		kc::unparse(rr, kc_printer, kc_current_view);
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_pointer_option po = this->ac_pointer_option_1;
		const ac_ref_option rr = this->ac_ref_option_1;
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(po, kc_printer, kc_current_view);
		kc::unparse(rr, kc_printer, kc_current_view);
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcOperatorDeclId::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_operator_name id = this->ac_operator_name_1;
		{ kc_printer(kc_t("operator "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcConvOperatorDecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_2;
		{ kc_printer(kc_t("operator "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fn_pointer_name_enum: {
	    view_gen_fn_pointer_name_class& kc_current_view=static_cast<view_gen_fn_pointer_name_class&>(kc_current_view_base);
	    {
		const ID clid = this->ID_1;
		const ID id = this->ID_2;
		kc::unparse(clid, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("::operator "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
		const ID clid = this->ID_1;
		const ID id = this->ID_2;
		kc::unparse(clid, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("::operator "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcMemberDecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_2;
		const ac_constant_expression_list idxs = this->ac_constant_expression_list_1;
		kc::unparse(id, kc_printer, kc_current_view);
		kc::unparse(idxs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fn_pointer_name_enum: {
	    view_gen_fn_pointer_name_class& kc_current_view=static_cast<view_gen_fn_pointer_name_class&>(kc_current_view_base);
	    {
		const ID clid = this->ID_1;
		const ID id = this->ID_2;
		const ac_constant_expression_list idxs = this->ac_constant_expression_list_1;
		kc::unparse(clid, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("::"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		kc::unparse(idxs, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
		const ID clid = this->ID_1;
		const ID id = this->ID_2;
		const ac_constant_expression_list idxs = this->ac_constant_expression_list_1;
		kc::unparse(clid, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("::"), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
		kc::unparse(idxs, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcQualifiedDeclProto::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_opt_const_enum: {
	    view_gen_opt_const_class& kc_current_view=static_cast<view_gen_opt_const_class&>(kc_current_view_base);
	    {
		const ac_type_qualifier co = this->ac_type_qualifier_1;
		kc::unparse(co, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator id = this->ac_direct_declarator_1;
		const ac_parameter_type_list args = this->ac_parameter_type_list_1;
		const ac_type_qualifier opt_const = this->ac_type_qualifier_1;
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(args, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
		kc::unparse(opt_const, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";\
\n"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    if ((this->ac_class_qualifier_list_1->prod_sel() == sel_Nilac_class_qualifier_list)) {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
		{ kc_printer(kc_t("()"), kc_current_view); }
	    } else
	    {
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fn_pointer_name_enum: {
	    view_gen_fn_pointer_name_class& kc_current_view=static_cast<view_gen_fn_pointer_name_class&>(kc_current_view_base);
	    {
		const ac_class_qualifier_list dd = this->ac_class_qualifier_list_1;
		const ac_direct_declarator id = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_class_qualifier_list qq = this->ac_class_qualifier_list_1;
		const ac_direct_declarator id = this->ac_direct_declarator_1;
		const ac_parameter_type_list ptl = this->ac_parameter_type_list_1;
		const ac_type_qualifier oc = this->ac_type_qualifier_1;
		kc::unparse(qq, kc_printer, kc_current_view);
		kc::unparse(id, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ptl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
		kc::unparse(oc, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcDirectDeclProto::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_opt_const_enum: {
	    view_gen_opt_const_class& kc_current_view=static_cast<view_gen_opt_const_class&>(kc_current_view_base);
	    {
	    }
	    break;
	}
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
		{ kc_printer(kc_t("()"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fn_pointer_name_enum: {
	    view_gen_fn_pointer_name_class& kc_current_view=static_cast<view_gen_fn_pointer_name_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		const ac_parameter_type_list ptl = this->ac_parameter_type_list_1;
		kc::unparse(dd, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ptl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcDirectDeclArray::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		const ac_constant_expression_option ceo = this->ac_constant_expression_option_1;
		kc::unparse(dd, kc_printer, kc_current_view);
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(ceo, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		kc::unparse(dd, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_direct_declarator dd = this->ac_direct_declarator_1;
		const ac_constant_expression_option ceo = this->ac_constant_expression_option_1;
		kc::unparse(dd, kc_printer, kc_current_view);
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(ceo, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcDirectDeclPack::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_declarator d = this->ac_declarator_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(d, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_declarator d = this->ac_declarator_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_direct_declarator_AcDirectDeclId::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ID i = this->ID_1;
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ID i = this->ID_1;
		kc::unparse(i, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_pointer_option_Yespointer::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_pointer p = this->ac_pointer_1;
		kc::unparse(p, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_pointer_option_Nopointer::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}


void
impl_ac_pointer_AcPointerCons::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_type_qualifier_list_1->prod_sel() == sel_Nilac_type_qualifier_list)) {
		const ac_pointer p = this->ac_pointer_1;
		{ kc_printer(kc_t("*"), kc_current_view); }
		kc::unparse(p, kc_printer, kc_current_view);
	    } else
	    {
		const ac_type_qualifier_list tql = this->ac_type_qualifier_list_1;
		const ac_pointer p = this->ac_pointer_1;
		{ kc_printer(kc_t("* "), kc_current_view); }
		kc::unparse(tql, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(p, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_pointer_AcPointerNil::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_type_qualifier_list_1->prod_sel() == sel_Nilac_type_qualifier_list)) {
		{ kc_printer(kc_t("*"), kc_current_view); }
	    } else
	    {
		const ac_type_qualifier_list tql = this->ac_type_qualifier_list_1;
		{ kc_printer(kc_t("* "), kc_current_view); }
		kc::unparse(tql, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_ref_option_AcRef::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		{ kc_printer(kc_t("&"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_ref_option_AcNoRef::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}


void
impl_ac_operator_name_AcOperatorName::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_ac_class_qualifier_help_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (ac_class_qualifier_help_list iterator_ = this; iterator_->ac_class_qualifier_help_list_1 != 0; iterator_ = iterator_->ac_class_qualifier_help_list_1)
		    iterator_->ac_direct_declarator_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_class_qualifier_help_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_ac_class_qualifier_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ID head = this->ID_1;
		const ac_class_qualifier_list tail = this->ac_class_qualifier_list_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		kc::unparse(head, kc_printer, kc_current_view);
		{ kc_printer(kc_t("::"), kc_current_view); }
	    }
	    break;
	}
    }
}

void
impl_ac_class_qualifier_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_ac_type_qualifier_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_type_qualifier_list_1->prod_sel() == sel_Nilac_type_qualifier_list)) {
		const ac_type_qualifier h = this->ac_type_qualifier_1;
		kc::unparse(h, kc_printer, kc_current_view);
	    } else
	    {
		const ac_type_qualifier h = this->ac_type_qualifier_1;
		const ac_type_qualifier_list t = this->ac_type_qualifier_list_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_type_qualifier_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_parameter_type_list_AcParList3Dot::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_parameter_list pl = this->ac_parameter_list_1;
		kc::unparse(pl, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_parameter_list pl = this->ac_parameter_list_1;
		kc::unparse(pl, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_parameter_list pl = this->ac_parameter_list_1;
		kc::unparse(pl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" ..."), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_parameter_type_list_AcParList::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    if ((this->ac_parameter_list_1->prod_sel() == sel_Nilac_parameter_list)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    if ((this->ac_parameter_list_1->prod_sel() == sel_Nilac_parameter_list)) {
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_parameter_list pl = this->ac_parameter_list_1;
		kc::unparse(pl, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_parameter_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    if ((this->ac_parameter_list_1->prod_sel() == sel_Nilac_parameter_list)) {
		const ac_parameter_declaration h = this->ac_parameter_declaration_1;
		kc::unparse(h, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";"), kc_current_view); }
	    } else
	    {
		const ac_parameter_declaration h = this->ac_parameter_declaration_1;
		const ac_parameter_list t = this->ac_parameter_list_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
		{ kc_printer(kc_t(";"), kc_current_view); }
	    }
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_parameter_list_1->prod_sel() == sel_Nilac_parameter_list)) {
		const ac_parameter_declaration h = this->ac_parameter_declaration_1;
		kc::unparse(h, kc_printer, kc_current_view);
	    } else
	    {
		const ac_parameter_declaration h = this->ac_parameter_declaration_1;
		const ac_parameter_list t = this->ac_parameter_list_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_parameter_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_parameter_declaration_AcParDeclAbsdecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ad, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkdecls_c_enum: {
	    view_gen_fnkdecls_c_class& kc_current_view=static_cast<view_gen_fnkdecls_c_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnk_h_enum: {
	    view_gen_fnk_h_class& kc_current_view=static_cast<view_gen_fnk_h_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_parameter_declaration_AcParDeclDecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_member_dcl_h_enum: {
	    view_gen_member_dcl_h_class& kc_current_view=static_cast<view_gen_member_dcl_h_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(d, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkdecls_c_enum: {
	    view_gen_fnkdecls_c_class& kc_current_view=static_cast<view_gen_fnkdecls_c_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}
	case view_gen_fnk_h_enum: {
	    view_gen_fnk_h_class& kc_current_view=static_cast<view_gen_fnk_h_class&>(kc_current_view_base);
	    if ((this->ac_constant_expression_option_1->prod_sel() == sel_Noac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
	    } else
		if ((this->ac_constant_expression_option_1->prod_sel() == sel_Yesac_constant_expression)) {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		const ac_constant_expression expr = phylum_cast<const impl_ac_constant_expression_option_Yesac_constant_expression*>(this->ac_constant_expression_option_1)->ac_constant_expression_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
		{ kc_printer(kc_t("="), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
	    } else
		    goto kc_unparsing_default;
	    break;
	}

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_declaration_specifiers ds = this->ac_declaration_specifiers_1;
		const ac_declarator d = this->ac_declarator_1;
		kc::unparse(ds, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(d, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_identifier_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->ac_identifier_list_1->prod_sel() == sel_Nilac_identifier_list)) {
		const ID h = this->ID_1;
		kc::unparse(h, kc_printer, kc_current_view);
	    } else
	    {
		const ID h = this->ID_1;
		const ac_identifier_list t = this->ac_identifier_list_1;
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", "), kc_current_view); }
		kc::unparse(h, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_identifier_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	kc_unparsing_default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_abstract_declarator_AcAbsdeclDirdecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_pointer_option p = this->ac_pointer_option_1;
		const ac_direct_abstract_declarator dad = this->ac_direct_abstract_declarator_1;
		kc::unparse(p, kc_printer, kc_current_view);
		kc::unparse(dad, kc_printer, kc_current_view);
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_abstract_declarator dad = this->ac_direct_abstract_declarator_1;
		kc::unparse(dad, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_pointer_option po = this->ac_pointer_option_1;
		const ac_direct_abstract_declarator dad = this->ac_direct_abstract_declarator_1;
		kc::unparse(po, kc_printer, kc_current_view);
		kc::unparse(dad, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_abstract_declarator_AcAbsdeclPointer::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkdecls_enum: {
	    view_gen_fnkdecls_class& kc_current_view=static_cast<view_gen_fnkdecls_class&>(kc_current_view_base);
	    {
		const ac_pointer p = this->ac_pointer_1;
		kc::unparse(p, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" kc_arg_missing"), kc_current_view); }
	    }
	    break;
	}
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		{ kc_printer(kc_t("kc_arg_missing"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_pointer p = this->ac_pointer_1;
		kc::unparse(p, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_direct_abstract_declarator_option_Yesac_direct_abstract_declarator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_direct_abstract_declarator dad = this->ac_direct_abstract_declarator_1;
		kc::unparse(dad, kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}


void
impl_ac_direct_abstract_declarator_option_Noac_direct_abstract_declarator::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_direct_abstract_declarator_AcDirAbsdeclFn::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_abstract_declarator_option dado = this->ac_direct_abstract_declarator_option_1;
		kc::unparse(dado, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_direct_abstract_declarator_option dado = this->ac_direct_abstract_declarator_option_1;
		const ac_parameter_type_list ptl = this->ac_parameter_type_list_1;
		kc::unparse(dado, kc_printer, kc_current_view);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ptl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_direct_abstract_declarator_AcDirAbsdeclArray::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_direct_abstract_declarator_option dado = this->ac_direct_abstract_declarator_option_1;
		kc::unparse(dado, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_direct_abstract_declarator_option dado = this->ac_direct_abstract_declarator_option_1;
		const ac_constant_expression_option ceo = this->ac_constant_expression_option_1;
		kc::unparse(dado, kc_printer, kc_current_view);
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(ceo, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_direct_abstract_declarator_AcDirAbsdeclPack::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnkargs_enum: {
	    view_gen_fnkargs_class& kc_current_view=static_cast<view_gen_fnkargs_class&>(kc_current_view_base);
	    {
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		kc::unparse(ad, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_abstract_declarator ad = this->ac_abstract_declarator_1;
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(ad, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}
    }
}


void
impl_ac_constant_expression_option_Noac_constant_expression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_constant_expression_option_Yesac_constant_expression::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_ac_constant_expression_AcConstExpr::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const Cexpression ce = this->Cexpression_1;
		kc::unparse(ce, kc_printer, view_gen_initializephyla_c);
	    }
	    break;
	}
    }
}

void
impl_ac_constant_expression_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
		const ac_constant_expression head = this->ac_constant_expression_1;
		const ac_constant_expression_list tail = this->ac_constant_expression_list_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t("["), kc_current_view); }
		kc::unparse(head, kc_printer, kc_current_view);
		{ kc_printer(kc_t("]"), kc_current_view); }
	    }
	    break;
	}
    }
}

void
impl_ac_constant_expression_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_opt_base_init_list_AcYesBaseInit::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
		const ac_base_init_list base_init_list = this->ac_base_init_list_1;
		{ kc_printer(kc_t(":"), kc_current_view); }
		kc::unparse(base_init_list, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}


void
impl_ac_opt_base_init_list_AcNoBaseInit::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    {
	    }
	    break;
	}
    }
}

void
impl_ac_base_init_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    if ((this->ac_base_init_list_1->prod_sel() == sel_Nilac_base_init_list)) {
		const ac_base_init head = this->ac_base_init_1;
		kc::unparse(head, kc_printer, kc_current_view);
	    } else
	    {
		const ac_base_init head = this->ac_base_init_1;
		const ac_base_init_list tail = this->ac_base_init_list_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t(","), kc_current_view); }
		kc::unparse(head, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (ac_base_init_list iterator_ = this; iterator_->ac_base_init_list_1 != 0; iterator_ = iterator_->ac_base_init_list_1)
		    iterator_->ac_base_init_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_ac_base_init_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_ac_base_init_AcBaseInit::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_gen_fnk_c_enum: {
	    view_gen_fnk_c_class& kc_current_view=static_cast<view_gen_fnk_c_class&>(kc_current_view_base);
	    {
		const ID id = this->ID_1;
		const ac_constant_expression expr = this->ac_constant_expression_1;
		kc::unparse(id, kc_printer, view_gen_fn_pointer_name);
		{ kc_printer(kc_t("("), kc_current_view); }
		kc::unparse(expr, kc_printer, kc_current_view);
		{ kc_printer(kc_t(")"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_baseclass_declarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (baseclass_declarations iterator_ = this; iterator_->baseclass_declarations_1 != 0; iterator_ = iterator_->baseclass_declarations_1)
		    iterator_->baseclass_decl_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_baseclass_declarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_baseclass_decl_BaseClassDecl::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_baseclass_list::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((this->baseclass_list_1->prod_sel() == sel_Nilbaseclass_list)) {
		const ID head = this->ID_1;
		{ kc_printer(kc_t("public "), kc_current_view); }
		kc::unparse(head, kc_printer, view_gen_fn_pointer_name);
	    } else
	    {
		const ID head = this->ID_1;
		const baseclass_list tail = this->baseclass_list_1;
		kc::unparse(tail, kc_printer, kc_current_view);
		{ kc_printer(kc_t(", public "), kc_current_view); }
		kc::unparse(head, kc_printer, view_gen_fn_pointer_name);
	    }
	    break;
	}
    }
}

void
impl_baseclass_list::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_error_Warning::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const fileline fl = this->fileline_1;
		const problem e = this->problem_1;
		kc::unparse(g_progname, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": warning"), kc_current_view); }
		kc::unparse(fl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": "), kc_current_view); }
		kc::unparse(e, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}
	case view_error_format_enum: {
	    view_error_format_class& kc_current_view=static_cast<view_error_format_class&>(kc_current_view_base);
	    {
		const fileline fl = this->fileline_1;
		const problem e = this->problem_1;

		kc_current_view.program(g_progname->name);
		kc_current_view.severity("warning");

		kc::unparse(fl, kc_printer, kc_current_view);
		PRINT(kc_current_view.get_msg()); 
		kc::unparse(e, kc_printer, view_error);
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_error_NonFatal::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const fileline fl = this->fileline_1;
		const problem e = this->problem_1;
		gp_no_fatal_problems=false; 
		kc::unparse(g_progname, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": error"), kc_current_view); }
		kc::unparse(fl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": "), kc_current_view); }
		kc::unparse(e, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}
	case view_error_format_enum: {
	    view_error_format_class& kc_current_view=static_cast<view_error_format_class&>(kc_current_view_base);
	    {
		const fileline fl = this->fileline_1;
		const problem e = this->problem_1;
		gp_no_fatal_problems=false;
		kc_current_view.program(g_progname->name);
		kc_current_view.severity("error");

		kc::unparse(fl, kc_printer, kc_current_view);
		PRINT(kc_current_view.get_msg()); 
		kc::unparse(e, kc_printer, view_error);
		{ kc_printer(kc_t("\n"), kc_current_view); }
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_error_Fatal::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const fileline fl = this->fileline_1;
		const problem e = this->problem_1;
		gp_no_fatal_problems=false; 
		kc::unparse(g_progname, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": fatal error"), kc_current_view); }
		kc::unparse(fl, kc_printer, kc_current_view);
		{ kc_printer(kc_t(": "), kc_current_view); }
		kc::unparse(e, kc_printer, kc_current_view);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		leave( 1 ); 
	    }
	    break;
	}
	case view_error_format_enum: {
	    view_error_format_class& kc_current_view=static_cast<view_error_format_class&>(kc_current_view_base);
	    {
		const fileline fl = this->fileline_1;
		const problem e = this->problem_1;
		gp_no_fatal_problems=false;
		kc_current_view.program(g_progname->name);
		kc_current_view.severity("fatal error");

		kc::unparse(fl, kc_printer, kc_current_view);
		PRINT(kc_current_view.get_msg()); 
		kc::unparse(e, kc_printer, view_error);
		{ kc_printer(kc_t("\n"), kc_current_view); }
		leave( 1 ); 
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem6::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const casestring s2 = this->casestring_2;
		const casestring s3 = this->casestring_3;
		const casestring s4 = this->casestring_4;
		const casestring s5 = this->casestring_5;
		const casestring s6 = this->casestring_6;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s4, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s5, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s6, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem5::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const casestring s2 = this->casestring_2;
		const casestring s3 = this->casestring_3;
		const casestring s4 = this->casestring_4;
		const casestring s5 = this->casestring_5;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s4, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s5, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem4::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const casestring s2 = this->casestring_2;
		const casestring s3 = this->casestring_3;
		const casestring s4 = this->casestring_4;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s4, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem3int1::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const casestring s2 = this->casestring_2;
		const casestring s3 = this->casestring_3;
		const integer i1 = this->integer_1;
		const casestring s4 = this->casestring_4;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(i1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s4, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem3::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const casestring s2 = this->casestring_2;
		const casestring s3 = this->casestring_3;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem2::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const casestring s2 = this->casestring_2;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1storageoption1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const storageoption so = this->storageoption_1;
		const casestring s2 = this->casestring_2;
		const ID id = this->ID_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(so, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1INT1ID1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const INT i1 = this->INT_1;
		const casestring s2 = this->casestring_2;
		const ID id1 = this->ID_1;
		const casestring s3 = this->casestring_3;
		const ID id2 = this->ID_2;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(i1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id2, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1ID1ID1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const ID id1 = this->ID_1;
		const casestring s2 = this->casestring_2;
		const ID id2 = this->ID_2;
		const casestring s3 = this->casestring_3;
		const ID id3 = this->ID_3;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s3, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id3, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1INT1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const INT i1 = this->INT_1;
		const casestring s2 = this->casestring_2;
		const ID id1 = this->ID_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(i1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id1, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1int1::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const integer i1 = this->integer_1;
		const casestring s2 = this->casestring_2;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(i1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1INT::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const INT i1 = this->INT_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(i1, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1t1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const IDtype t = this->IDtype_1;
		const casestring s2 = this->casestring_2;
		const ID id = this->ID_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(t, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1ID1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const ID id1 = this->ID_1;
		const casestring s2 = this->casestring_2;
		const ID id2 = this->ID_2;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(s2, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id2, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1we::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const withexpression we1 = this->withexpression_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(we1, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1tID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const ID id = this->ID_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id, kc_printer, view_error_tID);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1ID::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		const ID id = this->ID_1;
		kc::unparse(s1, kc_printer, kc_current_view);
		{ kc_printer(kc_t(" "), kc_current_view); }
		kc::unparse(id, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_problem_Problem1::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {
	case view_error_enum: {
	    view_error_class& kc_current_view=static_cast<view_error_class&>(kc_current_view_base);
	    {
		const casestring s1 = this->casestring_1;
		kc::unparse(s1, kc_printer, kc_current_view);
	    }
	    break;
	}

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_addedphylumdeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (addedphylumdeclarations iterator_ = this; iterator_->addedphylumdeclarations_1 != 0; iterator_ = iterator_->addedphylumdeclarations_1)
		    iterator_->addedphylumdeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_addedphylumdeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_addedphylumdeclaration_AddedPhylumdeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}

void
impl_countedphylumdeclarations::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (countedphylumdeclarations iterator_ = this; iterator_->countedphylumdeclarations_1 != 0; iterator_ = iterator_->countedphylumdeclarations_1)
		    iterator_->countedphylumdeclaration_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_countedphylumdeclarations::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_countedphylumdeclaration_CountedPhylumdeclaration::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


void
impl_charruns_Stars::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((KC_TRACE_PROVIDED((this->number>0), "gutil.k", 369, this))) {
		{ kc_printer(kc_t("*"), kc_current_view); }
		this->number--; 
		kc::unparse(this, kc_printer, kc_current_view);
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_charruns_QuotedNewlines::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((KC_TRACE_PROVIDED((this->number>0), "gutil.k", 368, this))) {
		{ kc_printer(kc_t("\\\n\\n"), kc_current_view); }
		this->number--; 
		kc::unparse(this, kc_printer, kc_current_view);
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_charruns_Newlines::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    if ((KC_TRACE_PROVIDED((this->number>0), "gutil.k", 367, this))) {
		{ kc_printer(kc_t("\n"), kc_current_view); }
		this->number--; 
		kc::unparse(this, kc_printer, kc_current_view);
	    } else
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}

void
impl_bindingidmarks::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    if(is_nil())
	nil_do_unparse(kc_printer, kc_current_view_base);
    else
	switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		for (bindingidmarks iterator_ = this; iterator_->bindingidmarks_1 != 0; iterator_ = iterator_->bindingidmarks_1)
		    iterator_->bindingidmark_1->unparse(kc_printer, kc_current_view);
	    }
	    break;
	}
    }
}

void
impl_bindingidmarks::nil_do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
	    }
	    break;
	}
    }
}


void
impl_bindingidmark_BindingIdMark::do_unparse(printer_functor kc_printer, uview kc_current_view_base)
{
    switch(kc_current_view_base) {

	default:
	case base_uview_enum: {
	    uview kc_current_view=kc_current_view_base;
	    { /* Alternative( *, args ) -> [view_gen_unparsedefs_default_c: */
		default_unparse(kc_printer, kc_current_view );
	    }
	    break;
	}
    }
}


} // namespace kc
