/* 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_REWRITE

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include "k.h"
#include "rk.h"


namespace kc {
base_rview_class base_rview;

impl_rviews rviews[] = {
    {"base_rview",&base_rview},
    {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
//

/* end included stuff */


namespace kc {

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

uniqID impl_uniqID_Str::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_uniqID_Str* kc_result= Str(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ID impl_ID_Id::rewrite(rview kc_current_view_base)
{
    uniqID l_uniqID_1 =
	uniqID_1->rewrite(kc_current_view_base);
    if ((l_uniqID_1 == uniqID_1))
	return this;
    else {
	impl_ID_Id* kc_result= Id(l_uniqID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

INT impl_INT_Int::rewrite(rview kc_current_view_base)
{
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    if ((l_integer_1 == integer_1))
	return this;
    else {
	impl_INT_Int* kc_result= Int(l_integer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

STRING impl_STRING_String::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_STRING_String* kc_result= String(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

phylumdeclarationsroot impl_phylumdeclarationsroot_PhylumDeclarations::rewrite(rview kc_current_view_base)
{
    phylumdeclarations l_phylumdeclarations_1 =
	phylumdeclarations_1->rewrite(kc_current_view_base);
    if ((l_phylumdeclarations_1 == phylumdeclarations_1))
	return this;
    else {
	impl_phylumdeclarationsroot_PhylumDeclarations* kc_result= PhylumDeclarations(l_phylumdeclarations_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

phylumdeclarations impl_phylumdeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	phylumdeclaration l_phylumdeclaration_1 =
	    phylumdeclaration_1->rewrite(kc_current_view_base);
	phylumdeclarations l_phylumdeclarations_1 =
	    phylumdeclarations_1->rewrite(kc_current_view_base);
	if ((l_phylumdeclaration_1 == phylumdeclaration_1) &&  (l_phylumdeclarations_1 == phylumdeclarations_1))
	    return this;
	else {
	    impl_phylumdeclarations* kc_result= Consphylumdeclarations(l_phylumdeclaration_1, l_phylumdeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

phylumnames impl_phylumnames::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	phylumnames l_phylumnames_1 =
	    phylumnames_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_phylumnames_1 == phylumnames_1))
	    return this;
	else {
	    impl_phylumnames* kc_result= Consphylumnames(l_ID_1, l_phylumnames_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

phylumdeclaration impl_phylumdeclaration_PhylumDeclaration::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    storageoption l_storageoption_1 =
	storageoption_1->rewrite(kc_current_view_base);
    productionblock l_productionblock_1 =
	productionblock_1->rewrite(kc_current_view_base);
    Ccode_option l_Ccode_option_1 =
	Ccode_option_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_storageoption_1 == storageoption_1) &&  (l_productionblock_1 == productionblock_1) &&  (l_Ccode_option_1 == Ccode_option_1))
	return this;
    else {
	impl_phylumdeclaration_PhylumDeclaration* kc_result= PhylumDeclaration(l_ID_1, l_storageoption_1, l_productionblock_1, l_Ccode_option_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

storageoption impl_storageoption_PositiveStorageOption::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_storageoption_PositiveStorageOption* kc_result= PositiveStorageOption(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

storageoption impl_storageoption_NegativeStorageOption::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_storageoption_NegativeStorageOption* kc_result= NegativeStorageOption(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

storageoption impl_storageoption_NoStorageOption::rewrite(rview kc_current_view_base)
{
    return this;

}

storageclasses impl_storageclasses::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	storageclasses l_storageclasses_1 =
	    storageclasses_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_storageclasses_1 == storageclasses_1))
	    return this;
	else {
	    impl_storageclasses* kc_result= Consstorageclasses(l_ID_1, l_storageclasses_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

productionblock impl_productionblock_PredefinedAlternatives::rewrite(rview kc_current_view_base)
{
    alternatives l_alternatives_1 =
	alternatives_1->rewrite(kc_current_view_base);
    if ((l_alternatives_1 == alternatives_1))
	return this;
    else {
	impl_productionblock_PredefinedAlternatives* kc_result= PredefinedAlternatives(l_alternatives_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

productionblock impl_productionblock_NonlistAlternatives::rewrite(rview kc_current_view_base)
{
    alternatives l_alternatives_1 =
	alternatives_1->rewrite(kc_current_view_base);
    if ((l_alternatives_1 == alternatives_1))
	return this;
    else {
	impl_productionblock_NonlistAlternatives* kc_result= NonlistAlternatives(l_alternatives_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

productionblock impl_productionblock_ListAlternatives::rewrite(rview kc_current_view_base)
{
    alternatives l_alternatives_1 =
	alternatives_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_alternatives_1 == alternatives_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_productionblock_ListAlternatives* kc_result= ListAlternatives(l_alternatives_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

productionblock impl_productionblock_Emptyproductionblock::rewrite(rview kc_current_view_base)
{
    return this;

}

alternatives impl_alternatives::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	alternative l_alternative_1 =
	    alternative_1->rewrite(kc_current_view_base);
	alternatives l_alternatives_1 =
	    alternatives_1->rewrite(kc_current_view_base);
	if ((l_alternative_1 == alternative_1) &&  (l_alternatives_1 == alternatives_1))
	    return this;
	else {
	    impl_alternatives* kc_result= Consalternatives(l_alternative_1, l_alternatives_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

alternative impl_alternative_Alternative::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    arguments l_arguments_1 =
	arguments_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_arguments_1 == arguments_1))
	return this;
    else {
	impl_alternative_Alternative* kc_result= Alternative(l_ID_1, l_arguments_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

arguments impl_arguments::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	arguments l_arguments_1 =
	    arguments_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_arguments_1 == arguments_1))
	    return this;
	else {
	    impl_arguments* kc_result= Consarguments(l_ID_1, l_arguments_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

argument impl_argument_Argument::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_integer_1 == integer_1))
	return this;
    else {
	impl_argument_Argument* kc_result= Argument(l_ID_1, l_integer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ccode_option impl_Ccode_option_CcodeOption::rewrite(rview kc_current_view_base)
{
    attributes l_attributes_1 =
	attributes_1->rewrite(kc_current_view_base);
    Ctexts l_Ctexts_1 =
	Ctexts_1->rewrite(kc_current_view_base);
    if ((l_attributes_1 == attributes_1) &&  (l_Ctexts_1 == Ctexts_1))
	return this;
    else {
	impl_Ccode_option_CcodeOption* kc_result= CcodeOption(l_attributes_1, l_Ctexts_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

attributes impl_attributes::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	attribute l_attribute_1 =
	    attribute_1->rewrite(kc_current_view_base);
	attributes l_attributes_1 =
	    attributes_1->rewrite(kc_current_view_base);
	if ((l_attribute_1 == attribute_1) &&  (l_attributes_1 == attributes_1))
	    return this;
	else {
	    impl_attributes* kc_result= Consattributes(l_attribute_1, l_attributes_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

attribute impl_attribute_Attribute::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    attribute_initialisation_option l_attribute_initialisation_option_1 =
	attribute_initialisation_option_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_ID_2 == ID_2) &&  (l_attribute_initialisation_option_1 == attribute_initialisation_option_1))
	return this;
    else {
	impl_attribute_Attribute* kc_result= Attribute(l_ID_1, l_ID_2, l_attribute_initialisation_option_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

attribute_initialisation_option impl_attribute_initialisation_option_Yesattribute_initialisation::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_attribute_initialisation_option_Yesattribute_initialisation* kc_result= Yesattribute_initialisation(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

attribute_initialisation_option impl_attribute_initialisation_option_Noattribute_initialisation::rewrite(rview kc_current_view_base)
{
    return this;

}

Cexpression impl_Cexpression::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	Cexpression_elem l_Cexpression_elem_1 =
	    Cexpression_elem_1->rewrite(kc_current_view_base);
	Cexpression l_Cexpression_1 =
	    Cexpression_1->rewrite(kc_current_view_base);
	if ((l_Cexpression_elem_1 == Cexpression_elem_1) &&  (l_Cexpression_1 == Cexpression_1))
	    return this;
	else {
	    impl_Cexpression* kc_result= ConsCexpression(l_Cexpression_elem_1, l_Cexpression_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

Cexpression_elem impl_Cexpression_elem_CExpressionArray::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_Cexpression_elem_CExpressionArray* kc_result= CExpressionArray(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Cexpression_elem impl_Cexpression_elem_CExpressionPack::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_Cexpression_elem_CExpressionPack* kc_result= CExpressionPack(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Cexpression_elem impl_Cexpression_elem_CExpressionSQ::rewrite(rview kc_current_view_base)
{
    CexpressionSQ l_CexpressionSQ_1 =
	CexpressionSQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionSQ_1 == CexpressionSQ_1))
	return this;
    else {
	impl_Cexpression_elem_CExpressionSQ* kc_result= CExpressionSQ(l_CexpressionSQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Cexpression_elem impl_Cexpression_elem_CExpressionDQ::rewrite(rview kc_current_view_base)
{
    CexpressionDQ l_CexpressionDQ_1 =
	CexpressionDQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionDQ_1 == CexpressionDQ_1))
	return this;
    else {
	impl_Cexpression_elem_CExpressionDQ* kc_result= CExpressionDQ(l_CexpressionDQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Cexpression_elem impl_Cexpression_elem_CExpressionNl::rewrite(rview kc_current_view_base)
{
    return this;

}

Cexpression_elem impl_Cexpression_elem_CExpressionDollarvar::rewrite(rview kc_current_view_base)
{
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_INT_1 == INT_1))
	return this;
    else {
	impl_Cexpression_elem_CExpressionDollarvar* kc_result= CExpressionDollarvar(l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Cexpression_elem impl_Cexpression_elem_CExpressionPart::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_Cexpression_elem_CExpressionPart* kc_result= CExpressionPart(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

CexpressionDQ impl_CexpressionDQ::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	CexpressionDQ_elem l_CexpressionDQ_elem_1 =
	    CexpressionDQ_elem_1->rewrite(kc_current_view_base);
	CexpressionDQ l_CexpressionDQ_1 =
	    CexpressionDQ_1->rewrite(kc_current_view_base);
	if ((l_CexpressionDQ_elem_1 == CexpressionDQ_elem_1) &&  (l_CexpressionDQ_1 == CexpressionDQ_1))
	    return this;
	else {
	    impl_CexpressionDQ* kc_result= ConsCexpressionDQ(l_CexpressionDQ_elem_1, l_CexpressionDQ_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

CexpressionDQ_elem impl_CexpressionDQ_elem_CExpressionDQNl::rewrite(rview kc_current_view_base)
{
    return this;

}

CexpressionDQ_elem impl_CexpressionDQ_elem_CExpressionDQPart::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_CexpressionDQ_elem_CExpressionDQPart* kc_result= CExpressionDQPart(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

CexpressionSQ impl_CexpressionSQ::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	CexpressionSQ_elem l_CexpressionSQ_elem_1 =
	    CexpressionSQ_elem_1->rewrite(kc_current_view_base);
	CexpressionSQ l_CexpressionSQ_1 =
	    CexpressionSQ_1->rewrite(kc_current_view_base);
	if ((l_CexpressionSQ_elem_1 == CexpressionSQ_elem_1) &&  (l_CexpressionSQ_1 == CexpressionSQ_1))
	    return this;
	else {
	    impl_CexpressionSQ* kc_result= ConsCexpressionSQ(l_CexpressionSQ_elem_1, l_CexpressionSQ_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

CexpressionSQ_elem impl_CexpressionSQ_elem_CExpressionSQNl::rewrite(rview kc_current_view_base)
{
    return this;

}

CexpressionSQ_elem impl_CexpressionSQ_elem_CExpressionSQPart::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_CexpressionSQ_elem_CExpressionSQPart* kc_result= CExpressionSQPart(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

idCexpressions impl_idCexpressions::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	idCexpression l_idCexpression_1 =
	    idCexpression_1->rewrite(kc_current_view_base);
	idCexpressions l_idCexpressions_1 =
	    idCexpressions_1->rewrite(kc_current_view_base);
	if ((l_idCexpression_1 == idCexpression_1) &&  (l_idCexpressions_1 == idCexpressions_1))
	    return this;
	else {
	    impl_idCexpressions* kc_result= ConsidCexpressions(l_idCexpression_1, l_idCexpressions_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

idCexpression impl_idCexpression_IdCexpression::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_idCexpression_IdCexpression* kc_result= IdCexpression(l_ID_1, l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctexts impl_Ctexts::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	Ctext l_Ctext_1 =
	    Ctext_1->rewrite(kc_current_view_base);
	Ctexts l_Ctexts_1 =
	    Ctexts_1->rewrite(kc_current_view_base);
	if ((l_Ctext_1 == Ctext_1) &&  (l_Ctexts_1 == Ctexts_1))
	    return this;
	else {
	    impl_Ctexts* kc_result= ConsCtexts(l_Ctext_1, l_Ctexts_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

includefiles impl_includefiles::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	includefile l_includefile_1 =
	    includefile_1->rewrite(kc_current_view_base);
	includefiles l_includefiles_1 =
	    includefiles_1->rewrite(kc_current_view_base);
	if ((l_includefile_1 == includefile_1) &&  (l_includefiles_1 == includefiles_1))
	    return this;
	else {
	    impl_includefiles* kc_result= Consincludefiles(l_includefile_1, l_includefiles_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

includefile impl_includefile_IncludeFile::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_includefile_IncludeFile* kc_result= IncludeFile(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

includedeclarations impl_includedeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	includedeclaration l_includedeclaration_1 =
	    includedeclaration_1->rewrite(kc_current_view_base);
	includedeclarations l_includedeclarations_1 =
	    includedeclarations_1->rewrite(kc_current_view_base);
	if ((l_includedeclaration_1 == includedeclaration_1) &&  (l_includedeclarations_1 == includedeclarations_1))
	    return this;
	else {
	    impl_includedeclarations* kc_result= Consincludedeclarations(l_includedeclaration_1, l_includedeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

includedeclaration impl_includedeclaration_IncludeDeclaration::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_includedeclaration_IncludeDeclaration* kc_result= IncludeDeclaration(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

rwdeclarations impl_rwdeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	rwdeclaration l_rwdeclaration_1 =
	    rwdeclaration_1->rewrite(kc_current_view_base);
	rwdeclarations l_rwdeclarations_1 =
	    rwdeclarations_1->rewrite(kc_current_view_base);
	if ((l_rwdeclaration_1 == rwdeclaration_1) &&  (l_rwdeclarations_1 == rwdeclarations_1))
	    return this;
	else {
	    impl_rwdeclarations* kc_result= Consrwdeclarations(l_rwdeclaration_1, l_rwdeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

rwdeclaration impl_rwdeclaration_RwDeclaration::rewrite(rview kc_current_view_base)
{
    outmostpatterns l_outmostpatterns_1 =
	outmostpatterns_1->rewrite(kc_current_view_base);
    rewriteclauses l_rewriteclauses_1 =
	rewriteclauses_1->rewrite(kc_current_view_base);
    if ((l_outmostpatterns_1 == outmostpatterns_1) &&  (l_rewriteclauses_1 == rewriteclauses_1))
	return this;
    else {
	impl_rwdeclaration_RwDeclaration* kc_result= RwDeclaration(l_outmostpatterns_1, l_rewriteclauses_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

rewriteclauses impl_rewriteclauses::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	rewriteclause l_rewriteclause_1 =
	    rewriteclause_1->rewrite(kc_current_view_base);
	rewriteclauses l_rewriteclauses_1 =
	    rewriteclauses_1->rewrite(kc_current_view_base);
	if ((l_rewriteclause_1 == rewriteclause_1) &&  (l_rewriteclauses_1 == rewriteclauses_1))
	    return this;
	else {
	    impl_rewriteclauses* kc_result= Consrewriteclauses(l_rewriteclause_1, l_rewriteclauses_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

rewriteclause impl_rewriteclause_RewriteClause::rewrite(rview kc_current_view_base)
{
    viewnames l_viewnames_1 =
	viewnames_1->rewrite(kc_current_view_base);
    term l_term_1 =
	term_1->rewrite(kc_current_view_base);
    if ((l_viewnames_1 == viewnames_1) &&  (l_term_1 == term_1))
	return this;
    else {
	impl_rewriteclause_RewriteClause* kc_result= RewriteClause(l_viewnames_1, l_term_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

patternchains impl_patternchains::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	patternchain l_patternchain_1 =
	    patternchain_1->rewrite(kc_current_view_base);
	patternchains l_patternchains_1 =
	    patternchains_1->rewrite(kc_current_view_base);
	switch(kc_current_view_base) {
	    default:
	    case base_rview_enum: {
		base_rview_class& kc_current_view=static_cast<base_rview_class&>(kc_current_view_base);
		if ((l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain) && (l_patternchains_1->prod_sel() == sel_Nilpatternchains)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 341, this);
		    const patternchains P_pcs = phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1;
		    patternchains kc_result = P_pcs;

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",342,kc_result);
		    return (const_cast<const impl_patternchains*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain) && (l_patternchains_1->prod_sel() == sel_Conspatternchains)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 352, this);
		    const patternchains P_pcs = phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1;
		    const patternchains Q_pcs = l_patternchains_1;
		    patternchains kc_result = concat(P_pcs, Q_pcs);

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",353,kc_result);
		    return (const_cast<const impl_patternchains*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    break;    }
	}
	if ((l_patternchain_1 == patternchain_1) &&  (l_patternchains_1 == patternchains_1))
	    return this;
	else {
	    impl_patternchains* kc_result= Conspatternchains(l_patternchain_1, l_patternchains_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

patternchain impl_patternchain::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	patternchainitem l_patternchainitem_1 =
	    patternchainitem_1->rewrite(kc_current_view_base);
	patternchain l_patternchain_1 =
	    patternchain_1->rewrite(kc_current_view_base);
	switch(kc_current_view_base) {
	    default:
	    case base_rview_enum: {
		base_rview_class& kc_current_view=static_cast<base_rview_class&>(kc_current_view_base);
		if ((l_patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && (l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 277, this);
		    const patternchain h_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchains T_pcs = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1;
		    const patternchain Y_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchain_1;
		    patternchain kc_result = Conspatternchain(PatternchainitemGroup(Conspatternchains(concat(h_pc, Y_pc), Conspatternchains(Conspatternchain(PatternchainitemGroup(T_pcs), Y_pc), Nilpatternchains()))), Nilpatternchain());

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",297,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && (l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 287, this);
		    const patternchain h_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchains T_pcs = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1;
		    const patternchain Y_pc = l_patternchain_1;
		    patternchain kc_result = Conspatternchain(PatternchainitemGroup(Conspatternchains(concat(h_pc, Y_pc), Conspatternchains(Conspatternchain(PatternchainitemGroup(T_pcs), Y_pc), Nilpatternchains()))), Nilpatternchain());

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",297,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains) && (l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 365, this);
		    const patternchain P_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchain Q_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchain_1;
		    patternchain kc_result = concat(P_pc, Q_pc);

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",366,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains) && (l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 377, this);
		    const patternchain P_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchain Q_pc = l_patternchain_1;
		    patternchain kc_result = concat(P_pc, Q_pc);

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",378,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && (l_patternchain_1->prod_sel() == sel_Conspatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 283, this);
		    const patternchain h_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchains T_pcs = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1;
		    const patternchain Y_pc = l_patternchain_1;
		    patternchain kc_result = Conspatternchain(PatternchainitemGroup(Conspatternchains(concat(h_pc, Y_pc), Conspatternchains(Conspatternchain(PatternchainitemGroup(T_pcs), Y_pc), Nilpatternchains()))), Nilpatternchain());

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",297,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains) && (l_patternchain_1->prod_sel() == sel_Conspatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 373, this);
		    const patternchain P_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>(l_patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchain Q_pc = l_patternchain_1;
		    patternchain kc_result = concat(P_pc, Q_pc);

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",378,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 306, this);
		    const patternchainitem p = l_patternchainitem_1;
		    const patternchain h_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchain_1;
		    const patternchains T_pcs = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1;
		    patternchain kc_result = Conspatternchain(PatternchainitemGroup(Conspatternchains(Conspatternchain(p, h_pc), Conspatternchains(Conspatternchain(p, Conspatternchain(PatternchainitemGroup(T_pcs), Nilpatternchain())), Nilpatternchains()))), Nilpatternchain());

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",321,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_patternchain_1->prod_sel() == sel_Conspatternchain) && ((l_patternchain_1)->patternchainitem_1->prod_sel() == sel_PatternchainitemGroup) && (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1->prod_sel() == sel_Conspatternchains) && ((phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains) && ((l_patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 387, this);
		    const patternchainitem p = l_patternchainitem_1;
		    const patternchain P_pc = (phylum_cast<const impl_patternchainitem_PatternchainitemGroup*>((l_patternchain_1)->patternchainitem_1)->patternchains_1)->patternchain_1;
		    patternchain kc_result = Conspatternchain(p, P_pc);

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",388,kc_result);
		    return (const_cast<const impl_patternchain*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    break;    }
	}
	if ((l_patternchainitem_1 == patternchainitem_1) &&  (l_patternchain_1 == patternchain_1))
	    return this;
	else {
	    impl_patternchain* kc_result= Conspatternchain(l_patternchainitem_1, l_patternchain_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

outmostpatterns impl_outmostpatterns::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	outmostpattern l_outmostpattern_1 =
	    outmostpattern_1->rewrite(kc_current_view_base);
	outmostpatterns l_outmostpatterns_1 =
	    outmostpatterns_1->rewrite(kc_current_view_base);
	if ((l_outmostpattern_1 == outmostpattern_1) &&  (l_outmostpatterns_1 == outmostpatterns_1))
	    return this;
	else {
	    impl_outmostpatterns* kc_result= Consoutmostpatterns(l_outmostpattern_1, l_outmostpatterns_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

patternchainitem impl_patternchainitem_PatternchainitemDollarid::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_patternchainitem_PatternchainitemDollarid* kc_result= PatternchainitemDollarid(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

patternchainitem impl_patternchainitem_PatternchainitemGroup::rewrite(rview kc_current_view_base)
{
    patternchains l_patternchains_1 =
	patternchains_1->rewrite(kc_current_view_base);
    switch(kc_current_view_base) {
	default:
	case base_rview_enum: {
	    base_rview_class& kc_current_view=static_cast<base_rview_class&>(kc_current_view_base);
	    if ((l_patternchains_1->prod_sel() == sel_Conspatternchains) && ((l_patternchains_1)->patternchain_1->prod_sel() == sel_Conspatternchain) && (((l_patternchains_1)->patternchain_1)->patternchain_1->prod_sel() == sel_Nilpatternchain) && ((l_patternchains_1)->patternchains_1->prod_sel() == sel_Nilpatternchains)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "util.k", 330, this);
		const patternchainitem h_p = ((l_patternchains_1)->patternchain_1)->patternchainitem_1;
		patternchainitem kc_result = h_p;

		KC_TRACE_REWRITE_RESULT(kc_current_view,"util.k",331,kc_result);
		return (const_cast<const impl_patternchainitem*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

	    } else
		break;    }
    }
    if ((l_patternchains_1 == patternchains_1))
	return this;
    else {
	impl_patternchainitem_PatternchainitemGroup* kc_result= PatternchainitemGroup(l_patternchains_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

patternchainitem impl_patternchainitem_PatternchainitemOutmost::rewrite(rview kc_current_view_base)
{
    outmostpattern l_outmostpattern_1 =
	outmostpattern_1->rewrite(kc_current_view_base);
    if ((l_outmostpattern_1 == outmostpattern_1))
	return this;
    else {
	impl_patternchainitem_PatternchainitemOutmost* kc_result= PatternchainitemOutmost(l_outmostpattern_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

outmostpattern impl_outmostpattern_OPDefault::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_outmostpattern_OPDefault* kc_result= OPDefault(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

outmostpattern impl_outmostpattern_OPWildcard::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_outmostpattern_OPWildcard* kc_result= OPWildcard(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

outmostpattern impl_outmostpattern_OPNonLeafVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    outmostpattern l_outmostpattern_1 =
	outmostpattern_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_outmostpattern_1 == outmostpattern_1))
	return this;
    else {
	impl_outmostpattern_OPNonLeafVariable* kc_result= OPNonLeafVariable(l_ID_1, l_outmostpattern_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

outmostpattern impl_outmostpattern_OPOperator::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    patterns l_patterns_1 =
	patterns_1->rewrite(kc_current_view_base);
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_patterns_1 == patterns_1) &&  (l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_outmostpattern_OPOperator* kc_result= OPOperator(l_ID_1, l_patterns_1, l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

outmostpattern impl_outmostpattern_OPOperatorWildcard::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_outmostpattern_OPOperatorWildcard* kc_result= OPOperatorWildcard(l_ID_1, l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

pattern impl_pattern_PIntLiteral::rewrite(rview kc_current_view_base)
{
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_INT_1 == INT_1))
	return this;
    else {
	impl_pattern_PIntLiteral* kc_result= PIntLiteral(l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

pattern impl_pattern_PStringLiteral::rewrite(rview kc_current_view_base)
{
    CexpressionDQ l_CexpressionDQ_1 =
	CexpressionDQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionDQ_1 == CexpressionDQ_1))
	return this;
    else {
	impl_pattern_PStringLiteral* kc_result= PStringLiteral(l_CexpressionDQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

pattern impl_pattern_PWildcard::rewrite(rview kc_current_view_base)
{
    return this;

}

pattern impl_pattern_PNonLeafVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    pattern l_pattern_1 =
	pattern_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_pattern_1 == pattern_1))
	return this;
    else {
	impl_pattern_PNonLeafVariable* kc_result= PNonLeafVariable(l_ID_1, l_pattern_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

pattern impl_pattern_POperator::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    patterns l_patterns_1 =
	patterns_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_patterns_1 == patterns_1))
	return this;
    else {
	impl_pattern_POperator* kc_result= POperator(l_ID_1, l_patterns_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

pattern impl_pattern_PVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_pattern_PVariable* kc_result= PVariable(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

patterns impl_patterns::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	pattern l_pattern_1 =
	    pattern_1->rewrite(kc_current_view_base);
	patterns l_patterns_1 =
	    patterns_1->rewrite(kc_current_view_base);
	if ((l_pattern_1 == pattern_1) &&  (l_patterns_1 == patterns_1))
	    return this;
	else {
	    impl_patterns* kc_result= Conspatterns(l_pattern_1, l_patterns_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

term impl_term_TIntLiteral::rewrite(rview kc_current_view_base)
{
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_INT_1 == INT_1))
	return this;
    else {
	impl_term_TIntLiteral* kc_result= TIntLiteral(l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TStringLiteral::rewrite(rview kc_current_view_base)
{
    CexpressionDQ l_CexpressionDQ_1 =
	CexpressionDQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionDQ_1 == CexpressionDQ_1))
	return this;
    else {
	impl_term_TStringLiteral* kc_result= TStringLiteral(l_CexpressionDQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TCTerm::rewrite(rview kc_current_view_base)
{
    CexpressionSQ l_CexpressionSQ_1 =
	CexpressionSQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionSQ_1 == CexpressionSQ_1))
	return this;
    else {
	impl_term_TCTerm* kc_result= TCTerm(l_CexpressionSQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TMemberVarDot::rewrite(rview kc_current_view_base)
{
    term l_term_1 =
	term_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_term_1 == term_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_term_TMemberVarDot* kc_result= TMemberVarDot(l_term_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TMemberVar::rewrite(rview kc_current_view_base)
{
    term l_term_1 =
	term_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_term_1 == term_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_term_TMemberVar* kc_result= TMemberVar(l_term_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TMethodDot::rewrite(rview kc_current_view_base)
{
    term l_term_1 =
	term_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    terms l_terms_1 =
	terms_1->rewrite(kc_current_view_base);
    if ((l_term_1 == term_1) &&  (l_ID_1 == ID_1) &&  (l_terms_1 == terms_1))
	return this;
    else {
	impl_term_TMethodDot* kc_result= TMethodDot(l_term_1, l_ID_1, l_terms_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TMethod::rewrite(rview kc_current_view_base)
{
    term l_term_1 =
	term_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    terms l_terms_1 =
	terms_1->rewrite(kc_current_view_base);
    if ((l_term_1 == term_1) &&  (l_ID_1 == ID_1) &&  (l_terms_1 == terms_1))
	return this;
    else {
	impl_term_TMethod* kc_result= TMethod(l_term_1, l_ID_1, l_terms_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TOperator::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    terms l_terms_1 =
	terms_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_terms_1 == terms_1))
	return this;
    else {
	impl_term_TOperator* kc_result= TOperator(l_ID_1, l_terms_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

term impl_term_TVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_term_TVariable* kc_result= TVariable(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

terms impl_terms::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	term l_term_1 =
	    term_1->rewrite(kc_current_view_base);
	terms l_terms_1 =
	    terms_1->rewrite(kc_current_view_base);
	if ((l_term_1 == term_1) &&  (l_terms_1 == terms_1))
	    return this;
	else {
	    impl_terms* kc_result= Consterms(l_term_1, l_terms_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

fnfiles impl_fnfiles::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	fnfile l_fnfile_1 =
	    fnfile_1->rewrite(kc_current_view_base);
	fnfiles l_fnfiles_1 =
	    fnfiles_1->rewrite(kc_current_view_base);
	if ((l_fnfile_1 == fnfile_1) &&  (l_fnfiles_1 == fnfiles_1))
	    return this;
	else {
	    impl_fnfiles* kc_result= Consfnfiles(l_fnfile_1, l_fnfiles_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

fnfile impl_fnfile_FnFile::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_fnfile_FnFile* kc_result= FnFile(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

fndeclarations impl_fndeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	fndeclaration l_fndeclaration_1 =
	    fndeclaration_1->rewrite(kc_current_view_base);
	fndeclarations l_fndeclarations_1 =
	    fndeclarations_1->rewrite(kc_current_view_base);
	if ((l_fndeclaration_1 == fndeclaration_1) &&  (l_fndeclarations_1 == fndeclarations_1))
	    return this;
	else {
	    impl_fndeclarations* kc_result= Consfndeclarations(l_fndeclaration_1, l_fndeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

fndeclaration impl_fndeclaration_AcMemberDeclaration::rewrite(rview kc_current_view_base)
{
    ac_declaration_specifiers l_ac_declaration_specifiers_1 =
	ac_declaration_specifiers_1->rewrite(kc_current_view_base);
    ac_declarator l_ac_declarator_1 =
	ac_declarator_1->rewrite(kc_current_view_base);
    ac_constant_expression_option l_ac_constant_expression_option_1 =
	ac_constant_expression_option_1->rewrite(kc_current_view_base);
    fnclass l_fnclass_1 =
	fnclass_1->rewrite(kc_current_view_base);
    if ((l_ac_declaration_specifiers_1 == ac_declaration_specifiers_1) &&  (l_ac_declarator_1 == ac_declarator_1) &&  (l_ac_constant_expression_option_1 == ac_constant_expression_option_1) &&  (l_fnclass_1 == fnclass_1))
	return this;
    else {
	impl_fndeclaration_AcMemberDeclaration* kc_result= AcMemberDeclaration(l_ac_declaration_specifiers_1, l_ac_declarator_1, l_ac_constant_expression_option_1, l_fnclass_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

fndeclaration impl_fndeclaration_FnAcDeclaration::rewrite(rview kc_current_view_base)
{
    ac_declaration_specifiers l_ac_declaration_specifiers_1 =
	ac_declaration_specifiers_1->rewrite(kc_current_view_base);
    ac_declarator l_ac_declarator_1 =
	ac_declarator_1->rewrite(kc_current_view_base);
    ac_declaration_list l_ac_declaration_list_1 =
	ac_declaration_list_1->rewrite(kc_current_view_base);
    ac_opt_base_init_list l_ac_opt_base_init_list_1 =
	ac_opt_base_init_list_1->rewrite(kc_current_view_base);
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    fnclass l_fnclass_1 =
	fnclass_1->rewrite(kc_current_view_base);
    if ((l_ac_declaration_specifiers_1 == ac_declaration_specifiers_1) &&  (l_ac_declarator_1 == ac_declarator_1) &&  (l_ac_declaration_list_1 == ac_declaration_list_1) &&  (l_ac_opt_base_init_list_1 == ac_opt_base_init_list_1) &&  (l_Ctext_1 == Ctext_1) &&  (l_ID_1 == ID_1) &&  (l_fnclass_1 == fnclass_1))
	return this;
    else {
	impl_fndeclaration_FnAcDeclaration* kc_result= FnAcDeclaration(l_ac_declaration_specifiers_1, l_ac_declarator_1, l_ac_declaration_list_1, l_ac_opt_base_init_list_1, l_Ctext_1, l_ID_1, l_fnclass_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

fnclass impl_fnclass_ConvOperatorFn::rewrite(rview kc_current_view_base)
{
    return this;

}

fnclass impl_fnclass_DestructorFn::rewrite(rview kc_current_view_base)
{
    return this;

}

fnclass impl_fnclass_ConstructorFn::rewrite(rview kc_current_view_base)
{
    return this;

}

fnclass impl_fnclass_MemberFn::rewrite(rview kc_current_view_base)
{
    return this;

}

fnclass impl_fnclass_StaticFn::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_fnclass_StaticFn* kc_result= StaticFn(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

fnclass impl_fnclass_GlobalFn::rewrite(rview kc_current_view_base)
{
    return this;

}

Ctext impl_Ctext::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	Ctext_elem l_Ctext_elem_1 =
	    Ctext_elem_1->rewrite(kc_current_view_base);
	Ctext l_Ctext_1 =
	    Ctext_1->rewrite(kc_current_view_base);
	if ((l_Ctext_elem_1 == Ctext_elem_1) &&  (l_Ctext_1 == Ctext_1))
	    return this;
	else {
	    impl_Ctext* kc_result= ConsCtext(l_Ctext_elem_1, l_Ctext_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

Ctext_elem impl_Ctext_elem_CTextWithexpression::rewrite(rview kc_current_view_base)
{
    withexpressions l_withexpressions_1 =
	withexpressions_1->rewrite(kc_current_view_base);
    withcases l_withcases_1 =
	withcases_1->rewrite(kc_current_view_base);
    contextinfo l_contextinfo_1 =
	contextinfo_1->rewrite(kc_current_view_base);
    if ((l_withexpressions_1 == withexpressions_1) &&  (l_withcases_1 == withcases_1) &&  (l_contextinfo_1 == contextinfo_1))
	return this;
    else {
	impl_Ctext_elem_CTextWithexpression* kc_result= CTextWithexpression(l_withexpressions_1, l_withcases_1, l_contextinfo_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextForeachexpression::rewrite(rview kc_current_view_base)
{
    patternchain l_patternchain_1 =
	patternchain_1->rewrite(kc_current_view_base);
    idCexpressions l_idCexpressions_1 =
	idCexpressions_1->rewrite(kc_current_view_base);
    withexpressions l_withexpressions_1 =
	withexpressions_1->rewrite(kc_current_view_base);
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    foreach_after l_foreach_after_1 =
	foreach_after_1->rewrite(kc_current_view_base);
    if ((l_patternchain_1 == patternchain_1) &&  (l_idCexpressions_1 == idCexpressions_1) &&  (l_withexpressions_1 == withexpressions_1) &&  (l_Ctext_1 == Ctext_1) &&  (l_foreach_after_1 == foreach_after_1))
	return this;
    else {
	impl_Ctext_elem_CTextForeachexpression* kc_result= CTextForeachexpression(l_patternchain_1, l_idCexpressions_1, l_withexpressions_1, l_Ctext_1, l_foreach_after_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextCbody::rewrite(rview kc_current_view_base)
{
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    if ((l_Ctext_1 == Ctext_1))
	return this;
    else {
	impl_Ctext_elem_CTextCbody* kc_result= CTextCbody(l_Ctext_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextCexpressionSQ::rewrite(rview kc_current_view_base)
{
    CexpressionSQ l_CexpressionSQ_1 =
	CexpressionSQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionSQ_1 == CexpressionSQ_1))
	return this;
    else {
	impl_Ctext_elem_CTextCexpressionSQ* kc_result= CTextCexpressionSQ(l_CexpressionSQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextCexpressionDQ::rewrite(rview kc_current_view_base)
{
    CexpressionDQ l_CexpressionDQ_1 =
	CexpressionDQ_1->rewrite(kc_current_view_base);
    if ((l_CexpressionDQ_1 == CexpressionDQ_1))
	return this;
    else {
	impl_Ctext_elem_CTextCexpressionDQ* kc_result= CTextCexpressionDQ(l_CexpressionDQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextNl::rewrite(rview kc_current_view_base)
{
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    if ((l_integer_1 == integer_1))
	return this;
    else {
	impl_Ctext_elem_CTextNl* kc_result= CTextNl(l_integer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextDollarVar::rewrite(rview kc_current_view_base)
{
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_INT_1 == INT_1))
	return this;
    else {
	impl_Ctext_elem_CTextDollarVar* kc_result= CTextDollarVar(l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

Ctext_elem impl_Ctext_elem_CTextLine::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_Ctext_elem_CTextLine* kc_result= CTextLine(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

foreach_after impl_foreach_after_ForeachAfter::rewrite(rview kc_current_view_base)
{
    patternchain l_patternchain_1 =
	patternchain_1->rewrite(kc_current_view_base);
    idCexpressions l_idCexpressions_1 =
	idCexpressions_1->rewrite(kc_current_view_base);
    withexpressions l_withexpressions_1 =
	withexpressions_1->rewrite(kc_current_view_base);
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    if ((l_patternchain_1 == patternchain_1) &&  (l_idCexpressions_1 == idCexpressions_1) &&  (l_withexpressions_1 == withexpressions_1) &&  (l_Ctext_1 == Ctext_1))
	return this;
    else {
	impl_foreach_after_ForeachAfter* kc_result= ForeachAfter(l_patternchain_1, l_idCexpressions_1, l_withexpressions_1, l_Ctext_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

foreach_after impl_foreach_after_NoForeachAfter::rewrite(rview kc_current_view_base)
{
    return this;

}

contextinfo impl_contextinfo_NotInForeachContext::rewrite(rview kc_current_view_base)
{
    return this;

}

contextinfo impl_contextinfo_InForeachContext::rewrite(rview kc_current_view_base)
{
    patternchain l_patternchain_1 =
	patternchain_1->rewrite(kc_current_view_base);
    if ((l_patternchain_1 == patternchain_1))
	return this;
    else {
	impl_contextinfo_InForeachContext* kc_result= InForeachContext(l_patternchain_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

withexpressions impl_withexpressions::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	withexpression l_withexpression_1 =
	    withexpression_1->rewrite(kc_current_view_base);
	withexpressions l_withexpressions_1 =
	    withexpressions_1->rewrite(kc_current_view_base);
	if ((l_withexpression_1 == withexpression_1) &&  (l_withexpressions_1 == withexpressions_1))
	    return this;
	else {
	    impl_withexpressions* kc_result= Conswithexpressions(l_withexpression_1, l_withexpressions_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

withexpression impl_withexpression_WECexpression::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_withexpression_WECexpression* kc_result= WECexpression(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

withexpression impl_withexpression_WEVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_withexpression_WEVariable* kc_result= WEVariable(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

withcases impl_withcases::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	withcase l_withcase_1 =
	    withcase_1->rewrite(kc_current_view_base);
	withcases l_withcases_1 =
	    withcases_1->rewrite(kc_current_view_base);
	if ((l_withcase_1 == withcase_1) &&  (l_withcases_1 == withcases_1))
	    return this;
	else {
	    impl_withcases* kc_result= Conswithcases(l_withcase_1, l_withcases_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

withcase impl_withcase_Withcase::rewrite(rview kc_current_view_base)
{
    patternchains l_patternchains_1 =
	patternchains_1->rewrite(kc_current_view_base);
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    if ((l_patternchains_1 == patternchains_1) &&  (l_Ctext_1 == Ctext_1))
	return this;
    else {
	impl_withcase_Withcase* kc_result= Withcase(l_patternchains_1, l_Ctext_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparsedeclarations impl_unparsedeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	unparsedeclaration l_unparsedeclaration_1 =
	    unparsedeclaration_1->rewrite(kc_current_view_base);
	unparsedeclarations l_unparsedeclarations_1 =
	    unparsedeclarations_1->rewrite(kc_current_view_base);
	if ((l_unparsedeclaration_1 == unparsedeclaration_1) &&  (l_unparsedeclarations_1 == unparsedeclarations_1))
	    return this;
	else {
	    impl_unparsedeclarations* kc_result= Consunparsedeclarations(l_unparsedeclaration_1, l_unparsedeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

unparsedeclaration impl_unparsedeclaration_UnparseDeclaration::rewrite(rview kc_current_view_base)
{
    outmostpatterns l_outmostpatterns_1 =
	outmostpatterns_1->rewrite(kc_current_view_base);
    unparseclauses l_unparseclauses_1 =
	unparseclauses_1->rewrite(kc_current_view_base);
    if ((l_outmostpatterns_1 == outmostpatterns_1) &&  (l_unparseclauses_1 == unparseclauses_1))
	return this;
    else {
	impl_unparsedeclaration_UnparseDeclaration* kc_result= UnparseDeclaration(l_outmostpatterns_1, l_unparseclauses_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparseclauses impl_unparseclauses::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	unparseclause l_unparseclause_1 =
	    unparseclause_1->rewrite(kc_current_view_base);
	unparseclauses l_unparseclauses_1 =
	    unparseclauses_1->rewrite(kc_current_view_base);
	if ((l_unparseclause_1 == unparseclause_1) &&  (l_unparseclauses_1 == unparseclauses_1))
	    return this;
	else {
	    impl_unparseclauses* kc_result= Consunparseclauses(l_unparseclause_1, l_unparseclauses_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

unparseclause impl_unparseclause_UnparseClause::rewrite(rview kc_current_view_base)
{
    viewnames l_viewnames_1 =
	viewnames_1->rewrite(kc_current_view_base);
    unparseitems l_unparseitems_1 =
	unparseitems_1->rewrite(kc_current_view_base);
    if ((l_viewnames_1 == viewnames_1) &&  (l_unparseitems_1 == unparseitems_1))
	return this;
    else {
	impl_unparseclause_UnparseClause* kc_result= UnparseClause(l_viewnames_1, l_unparseitems_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

viewnames impl_viewnames::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	viewnames l_viewnames_1 =
	    viewnames_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_viewnames_1 == viewnames_1))
	    return this;
	else {
	    impl_viewnames* kc_result= Consviewnames(l_ID_1, l_viewnames_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

unparseitems impl_unparseitems::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	unparseitem l_unparseitem_1 =
	    unparseitem_1->rewrite(kc_current_view_base);
	unparseitems l_unparseitems_1 =
	    unparseitems_1->rewrite(kc_current_view_base);
	if ((l_unparseitem_1 == unparseitem_1) &&  (l_unparseitems_1 == unparseitems_1))
	    return this;
	else {
	    impl_unparseitems* kc_result= Consunparseitems(l_unparseitem_1, l_unparseitems_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

unparseitem impl_unparseitem_UViewVarDecl::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_ID_2 == ID_2) &&  (l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_unparseitem_UViewVarDecl* kc_result= UViewVarDecl(l_ID_1, l_ID_2, l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparseitem impl_unparseitem_UnpBody::rewrite(rview kc_current_view_base)
{
    languageoption l_languageoption_1 =
	languageoption_1->rewrite(kc_current_view_base);
    unparseitems l_unparseitems_1 =
	unparseitems_1->rewrite(kc_current_view_base);
    if ((l_languageoption_1 == languageoption_1) &&  (l_unparseitems_1 == unparseitems_1))
	return this;
    else {
	impl_unparseitem_UnpBody* kc_result= UnpBody(l_languageoption_1, l_unparseitems_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparseitem impl_unparseitem_UnpCtext::rewrite(rview kc_current_view_base)
{
    languageoption l_languageoption_1 =
	languageoption_1->rewrite(kc_current_view_base);
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    if ((l_languageoption_1 == languageoption_1) &&  (l_Ctext_1 == Ctext_1))
	return this;
    else {
	impl_unparseitem_UnpCtext* kc_result= UnpCtext(l_languageoption_1, l_Ctext_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparseitem impl_unparseitem_UnpSubexpr::rewrite(rview kc_current_view_base)
{
    languageoption l_languageoption_1 =
	languageoption_1->rewrite(kc_current_view_base);
    unpsubterm l_unpsubterm_1 =
	unpsubterm_1->rewrite(kc_current_view_base);
    viewnameoption l_viewnameoption_1 =
	viewnameoption_1->rewrite(kc_current_view_base);
    if ((l_languageoption_1 == languageoption_1) &&  (l_unpsubterm_1 == unpsubterm_1) &&  (l_viewnameoption_1 == viewnameoption_1))
	return this;
    else {
	impl_unparseitem_UnpSubexpr* kc_result= UnpSubexpr(l_languageoption_1, l_unpsubterm_1, l_viewnameoption_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparseitem impl_unparseitem_UnpStr::rewrite(rview kc_current_view_base)
{
    languageoption l_languageoption_1 =
	languageoption_1->rewrite(kc_current_view_base);
    CexpressionDQ l_CexpressionDQ_1 =
	CexpressionDQ_1->rewrite(kc_current_view_base);
    viewnameoption l_viewnameoption_1 =
	viewnameoption_1->rewrite(kc_current_view_base);
    if ((l_languageoption_1 == languageoption_1) &&  (l_CexpressionDQ_1 == CexpressionDQ_1) &&  (l_viewnameoption_1 == viewnameoption_1))
	return this;
    else {
	impl_unparseitem_UnpStr* kc_result= UnpStr(l_languageoption_1, l_CexpressionDQ_1, l_viewnameoption_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unpsubterm impl_unpsubterm_UnpCastedVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_ID_2 == ID_2))
	return this;
    else {
	impl_unpsubterm_UnpCastedVariable* kc_result= UnpCastedVariable(l_ID_1, l_ID_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unpsubterm impl_unpsubterm_UnpDollarvarAttr::rewrite(rview kc_current_view_base)
{
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    unpattributes l_unpattributes_1 =
	unpattributes_1->rewrite(kc_current_view_base);
    if ((l_INT_1 == INT_1) &&  (l_unpattributes_1 == unpattributes_1))
	return this;
    else {
	impl_unpsubterm_UnpDollarvarAttr* kc_result= UnpDollarvarAttr(l_INT_1, l_unpattributes_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unpsubterm impl_unpsubterm_UnpSubAttr::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    unpattributes l_unpattributes_1 =
	unpattributes_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_unpattributes_1 == unpattributes_1))
	return this;
    else {
	impl_unpsubterm_UnpSubAttr* kc_result= UnpSubAttr(l_ID_1, l_unpattributes_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unpsubterm impl_unpsubterm_UnpDollarvarTerm::rewrite(rview kc_current_view_base)
{
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_INT_1 == INT_1))
	return this;
    else {
	impl_unpsubterm_UnpDollarvarTerm* kc_result= UnpDollarvarTerm(l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unpsubterm impl_unpsubterm_UnpSubTerm::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_unpsubterm_UnpSubTerm* kc_result= UnpSubTerm(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unpattributes impl_unpattributes::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	unpattributes l_unpattributes_1 =
	    unpattributes_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_unpattributes_1 == unpattributes_1))
	    return this;
	else {
	    impl_unpattributes* kc_result= Consunpattributes(l_ID_1, l_unpattributes_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

viewnameoption impl_viewnameoption_YesViewname::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_viewnameoption_YesViewname* kc_result= YesViewname(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

viewnameoption impl_viewnameoption_NoViewname::rewrite(rview kc_current_view_base)
{
    return this;

}

languageoption impl_languageoption_LanguageList::rewrite(rview kc_current_view_base)
{
    languagenames l_languagenames_1 =
	languagenames_1->rewrite(kc_current_view_base);
    if ((l_languagenames_1 == languagenames_1))
	return this;
    else {
	impl_languageoption_LanguageList* kc_result= LanguageList(l_languagenames_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

languageoption impl_languageoption_NoLanguagename::rewrite(rview kc_current_view_base)
{
    return this;

}

languagenames impl_languagenames::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	languagenames l_languagenames_1 =
	    languagenames_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_languagenames_1 == languagenames_1))
	    return this;
	else {
	    impl_languagenames* kc_result= Conslanguagenames(l_ID_1, l_languagenames_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

fileline impl_fileline_PosNoFileLine::rewrite(rview kc_current_view_base)
{
    return this;

}

fileline impl_fileline_NoFileLine::rewrite(rview kc_current_view_base)
{
    return this;

}

fileline impl_fileline_FileLine::rewrite(rview kc_current_view_base)
{
    return this;

}

scopetypefilelinestack impl_scopetypefilelinestack::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	scopetypefileline l_scopetypefileline_1 =
	    scopetypefileline_1->rewrite(kc_current_view_base);
	scopetypefilelinestack l_scopetypefilelinestack_1 =
	    scopetypefilelinestack_1->rewrite(kc_current_view_base);
	if ((l_scopetypefileline_1 == scopetypefileline_1) &&  (l_scopetypefilelinestack_1 == scopetypefilelinestack_1))
	    return this;
	else {
	    impl_scopetypefilelinestack* kc_result= Consscopetypefilelinestack(l_scopetypefileline_1, l_scopetypefilelinestack_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

scopetypefileline impl_scopetypefileline_ScopeTypeFileLine::rewrite(rview kc_current_view_base)
{
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    IDtype l_IDtype_1 =
	IDtype_1->rewrite(kc_current_view_base);
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    integer l_integer_2 =
	integer_2->rewrite(kc_current_view_base);
    if ((l_integer_1 == integer_1) &&  (l_IDtype_1 == IDtype_1) &&  (l_casestring_1 == casestring_1) &&  (l_integer_2 == integer_2))
	return this;
    else {
	impl_scopetypefileline_ScopeTypeFileLine* kc_result= ScopeTypeFileLine(l_integer_1, l_IDtype_1, l_casestring_1, l_integer_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITLanguageName::rewrite(rview kc_current_view_base)
{
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    if ((l_integer_1 == integer_1))
	return this;
    else {
	impl_IDtype_ITLanguageName* kc_result= ITLanguageName(l_integer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITPatternVariable::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_integer_1 == integer_1))
	return this;
    else {
	impl_IDtype_ITPatternVariable* kc_result= ITPatternVariable(l_ID_1, l_integer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITUserFunction::rewrite(rview kc_current_view_base)
{
    fnclass l_fnclass_1 =
	fnclass_1->rewrite(kc_current_view_base);
    if ((l_fnclass_1 == fnclass_1))
	return this;
    else {
	impl_IDtype_ITUserFunction* kc_result= ITUserFunction(l_fnclass_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITUserRView::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITPredefinedRView::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITUViewVar::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITUserUView::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITPredefinedUView::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITStorageClass::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITPredefinedStorageClass::rewrite(rview kc_current_view_base)
{
    return this;

}

IDtype impl_IDtype_ITUserOperator::rewrite(rview kc_current_view_base)
{
    alternative l_alternative_1 =
	alternative_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_alternative_1 == alternative_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_IDtype_ITUserOperator* kc_result= ITUserOperator(l_alternative_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITPredefinedOperator::rewrite(rview kc_current_view_base)
{
    alternative l_alternative_1 =
	alternative_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_alternative_1 == alternative_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_IDtype_ITPredefinedOperator* kc_result= ITPredefinedOperator(l_alternative_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITUserPhylum::rewrite(rview kc_current_view_base)
{
    phylumdeclaration l_phylumdeclaration_1 =
	phylumdeclaration_1->rewrite(kc_current_view_base);
    if ((l_phylumdeclaration_1 == phylumdeclaration_1))
	return this;
    else {
	impl_IDtype_ITUserPhylum* kc_result= ITUserPhylum(l_phylumdeclaration_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITPredefinedPhylum::rewrite(rview kc_current_view_base)
{
    phylumdeclaration l_phylumdeclaration_1 =
	phylumdeclaration_1->rewrite(kc_current_view_base);
    if ((l_phylumdeclaration_1 == phylumdeclaration_1))
	return this;
    else {
	impl_IDtype_ITPredefinedPhylum* kc_result= ITPredefinedPhylum(l_phylumdeclaration_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

IDtype impl_IDtype_ITUnknown::rewrite(rview kc_current_view_base)
{
    return this;

}

operators impl_operators::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	operators l_operators_1 =
	    operators_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_operators_1 == operators_1))
	    return this;
	else {
	    impl_operators* kc_result= Consoperators(l_ID_1, l_operators_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

phyla impl_phyla::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	phyla l_phyla_1 =
	    phyla_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_phyla_1 == phyla_1))
	    return this;
	else {
	    impl_phyla* kc_result= Consphyla(l_ID_1, l_phyla_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

variables impl_variables::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	variables l_variables_1 =
	    variables_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_variables_1 == variables_1))
	    return this;
	else {
	    impl_variables* kc_result= Consvariables(l_ID_1, l_variables_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

dollarvarstatus impl_dollarvarstatus_DVDisallowed::rewrite(rview kc_current_view_base)
{
    return this;

}

dollarvarstatus impl_dollarvarstatus_DVAllowed::rewrite(rview kc_current_view_base)
{
    return this;

}

tribool impl_tribool_Bigger::rewrite(rview kc_current_view_base)
{
    return this;

}

tribool impl_tribool_Smaller::rewrite(rview kc_current_view_base)
{
    return this;

}

tribool impl_tribool_Equal::rewrite(rview kc_current_view_base)
{
    return this;

}

patternrepresentations impl_patternrepresentations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	patternrepresentation l_patternrepresentation_1 =
	    patternrepresentation_1->rewrite(kc_current_view_base);
	patternrepresentations l_patternrepresentations_1 =
	    patternrepresentations_1->rewrite(kc_current_view_base);
	if ((l_patternrepresentation_1 == patternrepresentation_1) &&  (l_patternrepresentations_1 == patternrepresentations_1))
	    return this;
	else {
	    impl_patternrepresentations* kc_result= Conspatternrepresentations(l_patternrepresentation_1, l_patternrepresentations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

patternrepresentation impl_patternrepresentation::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	elem_patternrepresentation l_elem_patternrepresentation_1 =
	    elem_patternrepresentation_1->rewrite(kc_current_view_base);
	patternrepresentation l_patternrepresentation_1 =
	    patternrepresentation_1->rewrite(kc_current_view_base);
	switch(kc_current_view_base) {
	    default:
	    case base_rview_enum: {
		base_rview_class& kc_current_view=static_cast<base_rview_class&>(kc_current_view_base);
		if ((l_elem_patternrepresentation_1->prod_sel() == sel_PRWildcard)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "gutil.k", 768, this);
		    const patternrepresentation r = l_patternrepresentation_1;
		    patternrepresentation kc_result = r;

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"gutil.k",768,kc_result);
		    return (const_cast<const impl_patternrepresentation*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    if ((l_elem_patternrepresentation_1->prod_sel() == sel_PRDefault)) { KC_TRACE_REWRITE_MATCH(kc_current_view, "gutil.k", 769, this);
		    const patternrepresentation r = l_patternrepresentation_1;
		    patternrepresentation kc_result = r;

		    KC_TRACE_REWRITE_RESULT(kc_current_view,"gutil.k",769,kc_result);
		    return (const_cast<const impl_patternrepresentation*>(kc_result) == this) ? this : kc_result->rewrite( kc_current_view_base );

		} else
		    break;    }
	}
	if ((l_elem_patternrepresentation_1 == elem_patternrepresentation_1) &&  (l_patternrepresentation_1 == patternrepresentation_1))
	    return this;
	else {
	    impl_patternrepresentation* kc_result= Conspatternrepresentation(l_elem_patternrepresentation_1, l_patternrepresentation_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRIntLiteral::rewrite(rview kc_current_view_base)
{
    path l_path_1 =
	path_1->rewrite(kc_current_view_base);
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_path_1 == path_1) &&  (l_INT_1 == INT_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRIntLiteral* kc_result= PRIntLiteral(l_path_1, l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRStringLiteral::rewrite(rview kc_current_view_base)
{
    path l_path_1 =
	path_1->rewrite(kc_current_view_base);
    CexpressionDQ l_CexpressionDQ_1 =
	CexpressionDQ_1->rewrite(kc_current_view_base);
    if ((l_path_1 == path_1) &&  (l_CexpressionDQ_1 == CexpressionDQ_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRStringLiteral* kc_result= PRStringLiteral(l_path_1, l_CexpressionDQ_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRDefault::rewrite(rview kc_current_view_base)
{
    return this;

}

elem_patternrepresentation impl_elem_patternrepresentation_PRWildcard::rewrite(rview kc_current_view_base)
{
    path l_path_1 =
	path_1->rewrite(kc_current_view_base);
    if ((l_path_1 == path_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRWildcard* kc_result= PRWildcard(l_path_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRNonLeafBinding::rewrite(rview kc_current_view_base)
{
    path l_path_1 =
	path_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    patternrepresentation l_patternrepresentation_1 =
	patternrepresentation_1->rewrite(kc_current_view_base);
    if ((l_path_1 == path_1) &&  (l_ID_1 == ID_1) &&  (l_patternrepresentation_1 == patternrepresentation_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRNonLeafBinding* kc_result= PRNonLeafBinding(l_path_1, l_ID_1, l_patternrepresentation_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRUserPredicate::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRUserPredicate* kc_result= PRUserPredicate(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PROperPredicate::rewrite(rview kc_current_view_base)
{
    path l_path_1 =
	path_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_path_1 == path_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_elem_patternrepresentation_PROperPredicate* kc_result= PROperPredicate(l_path_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRVarPredicate::rewrite(rview kc_current_view_base)
{
    paths l_paths_1 =
	paths_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    patternrepresentation l_patternrepresentation_1 =
	patternrepresentation_1->rewrite(kc_current_view_base);
    if ((l_paths_1 == paths_1) &&  (l_ID_1 == ID_1) &&  (l_patternrepresentation_1 == patternrepresentation_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRVarPredicate* kc_result= PRVarPredicate(l_paths_1, l_ID_1, l_patternrepresentation_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

elem_patternrepresentation impl_elem_patternrepresentation_PRBinding::rewrite(rview kc_current_view_base)
{
    path l_path_1 =
	path_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_path_1 == path_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_elem_patternrepresentation_PRBinding* kc_result= PRBinding(l_path_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

path impl_path::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	integer l_integer_1 =
	    integer_1->rewrite(kc_current_view_base);
	path l_path_1 =
	    path_1->rewrite(kc_current_view_base);
	if ((l_integer_1 == integer_1) &&  (l_path_1 == path_1))
	    return this;
	else {
	    impl_path* kc_result= Conspath(l_integer_1, l_path_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

paths impl_paths::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	path l_path_1 =
	    path_1->rewrite(kc_current_view_base);
	paths l_paths_1 =
	    paths_1->rewrite(kc_current_view_base);
	if ((l_path_1 == path_1) &&  (l_paths_1 == paths_1))
	    return this;
	else {
	    impl_paths* kc_result= Conspaths(l_path_1, l_paths_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

argsnumbers impl_argsnumbers::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	integer l_integer_1 =
	    integer_1->rewrite(kc_current_view_base);
	argsnumbers l_argsnumbers_1 =
	    argsnumbers_1->rewrite(kc_current_view_base);
	if ((l_integer_1 == integer_1) &&  (l_argsnumbers_1 == argsnumbers_1))
	    return this;
	else {
	    impl_argsnumbers* kc_result= Consargsnumbers(l_integer_1, l_argsnumbers_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

rewriterulesinfo impl_rewriterulesinfo::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	rewriteruleinfo l_rewriteruleinfo_1 =
	    rewriteruleinfo_1->rewrite(kc_current_view_base);
	rewriterulesinfo l_rewriterulesinfo_1 =
	    rewriterulesinfo_1->rewrite(kc_current_view_base);
	if ((l_rewriteruleinfo_1 == rewriteruleinfo_1) &&  (l_rewriterulesinfo_1 == rewriterulesinfo_1))
	    return this;
	else {
	    impl_rewriterulesinfo* kc_result= Consrewriterulesinfo(l_rewriteruleinfo_1, l_rewriterulesinfo_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

rewriteruleinfo impl_rewriteruleinfo_Rewriteruleinfo::rewrite(rview kc_current_view_base)
{
    patternrepresentation l_patternrepresentation_1 =
	patternrepresentation_1->rewrite(kc_current_view_base);
    patternrepresentation l_patternrepresentation_2 =
	patternrepresentation_2->rewrite(kc_current_view_base);
    rewriteclause l_rewriteclause_1 =
	rewriteclause_1->rewrite(kc_current_view_base);
    if ((l_patternrepresentation_1 == patternrepresentation_1) &&  (l_patternrepresentation_2 == patternrepresentation_2) &&  (l_rewriteclause_1 == rewriteclause_1))
	return this;
    else {
	impl_rewriteruleinfo_Rewriteruleinfo* kc_result= Rewriteruleinfo(l_patternrepresentation_1, l_patternrepresentation_2, l_rewriteclause_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

withcasesinfo impl_withcasesinfo::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	withcaseinfo l_withcaseinfo_1 =
	    withcaseinfo_1->rewrite(kc_current_view_base);
	withcasesinfo l_withcasesinfo_1 =
	    withcasesinfo_1->rewrite(kc_current_view_base);
	if ((l_withcaseinfo_1 == withcaseinfo_1) &&  (l_withcasesinfo_1 == withcasesinfo_1))
	    return this;
	else {
	    impl_withcasesinfo* kc_result= Conswithcasesinfo(l_withcaseinfo_1, l_withcasesinfo_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

withcaseinfo impl_withcaseinfo_Withcaseinfo::rewrite(rview kc_current_view_base)
{
    patternrepresentation l_patternrepresentation_1 =
	patternrepresentation_1->rewrite(kc_current_view_base);
    patternrepresentation l_patternrepresentation_2 =
	patternrepresentation_2->rewrite(kc_current_view_base);
    Ctext l_Ctext_1 =
	Ctext_1->rewrite(kc_current_view_base);
    if ((l_patternrepresentation_1 == patternrepresentation_1) &&  (l_patternrepresentation_2 == patternrepresentation_2) &&  (l_Ctext_1 == Ctext_1))
	return this;
    else {
	impl_withcaseinfo_Withcaseinfo* kc_result= Withcaseinfo(l_patternrepresentation_1, l_patternrepresentation_2, l_Ctext_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

rewriteviewsinfo impl_rewriteviewsinfo::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	rewriteviewinfo l_rewriteviewinfo_1 =
	    rewriteviewinfo_1->rewrite(kc_current_view_base);
	rewriteviewsinfo l_rewriteviewsinfo_1 =
	    rewriteviewsinfo_1->rewrite(kc_current_view_base);
	if ((l_rewriteviewinfo_1 == rewriteviewinfo_1) &&  (l_rewriteviewsinfo_1 == rewriteviewsinfo_1))
	    return this;
	else {
	    impl_rewriteviewsinfo* kc_result= Consrewriteviewsinfo(l_rewriteviewinfo_1, l_rewriteviewsinfo_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

rewriteviewinfo impl_rewriteviewinfo_Rewriteviewinfo::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    rewriterulesinfo l_rewriterulesinfo_1 =
	rewriterulesinfo_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_rewriterulesinfo_1 == rewriterulesinfo_1))
	return this;
    else {
	impl_rewriteviewinfo_Rewriteviewinfo* kc_result= Rewriteviewinfo(l_ID_1, l_rewriterulesinfo_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparseviewsinfo impl_unparseviewsinfo::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	unparseviewinfo l_unparseviewinfo_1 =
	    unparseviewinfo_1->rewrite(kc_current_view_base);
	unparseviewsinfo l_unparseviewsinfo_1 =
	    unparseviewsinfo_1->rewrite(kc_current_view_base);
	if ((l_unparseviewinfo_1 == unparseviewinfo_1) &&  (l_unparseviewsinfo_1 == unparseviewsinfo_1))
	    return this;
	else {
	    impl_unparseviewsinfo* kc_result= Consunparseviewsinfo(l_unparseviewinfo_1, l_unparseviewsinfo_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

unparseviewinfo impl_unparseviewinfo_Unparseviewinfo::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    unparsedeclsinfo l_unparsedeclsinfo_1 =
	unparsedeclsinfo_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_unparsedeclsinfo_1 == unparsedeclsinfo_1))
	return this;
    else {
	impl_unparseviewinfo_Unparseviewinfo* kc_result= Unparseviewinfo(l_ID_1, l_unparsedeclsinfo_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

unparsedeclsinfo impl_unparsedeclsinfo::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	unparsedeclinfo l_unparsedeclinfo_1 =
	    unparsedeclinfo_1->rewrite(kc_current_view_base);
	unparsedeclsinfo l_unparsedeclsinfo_1 =
	    unparsedeclsinfo_1->rewrite(kc_current_view_base);
	if ((l_unparsedeclinfo_1 == unparsedeclinfo_1) &&  (l_unparsedeclsinfo_1 == unparsedeclsinfo_1))
	    return this;
	else {
	    impl_unparsedeclsinfo* kc_result= Consunparsedeclsinfo(l_unparsedeclinfo_1, l_unparsedeclsinfo_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

unparsedeclinfo impl_unparsedeclinfo_Unparsedeclinfo::rewrite(rview kc_current_view_base)
{
    patternrepresentation l_patternrepresentation_1 =
	patternrepresentation_1->rewrite(kc_current_view_base);
    patternrepresentation l_patternrepresentation_2 =
	patternrepresentation_2->rewrite(kc_current_view_base);
    unparseclause l_unparseclause_1 =
	unparseclause_1->rewrite(kc_current_view_base);
    if ((l_patternrepresentation_1 == patternrepresentation_1) &&  (l_patternrepresentation_2 == patternrepresentation_2) &&  (l_unparseclause_1 == unparseclause_1))
	return this;
    else {
	impl_unparsedeclinfo_Unparsedeclinfo* kc_result= Unparsedeclinfo(l_patternrepresentation_1, l_patternrepresentation_2, l_unparseclause_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_declaration impl_ac_declaration_AcDeclaration::rewrite(rview kc_current_view_base)
{
    ac_declaration_specifiers l_ac_declaration_specifiers_1 =
	ac_declaration_specifiers_1->rewrite(kc_current_view_base);
    ac_init_declarator_list l_ac_init_declarator_list_1 =
	ac_init_declarator_list_1->rewrite(kc_current_view_base);
    if ((l_ac_declaration_specifiers_1 == ac_declaration_specifiers_1) &&  (l_ac_init_declarator_list_1 == ac_init_declarator_list_1))
	return this;
    else {
	impl_ac_declaration_AcDeclaration* kc_result= AcDeclaration(l_ac_declaration_specifiers_1, l_ac_init_declarator_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_declaration_list impl_ac_declaration_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_declaration l_ac_declaration_1 =
	    ac_declaration_1->rewrite(kc_current_view_base);
	ac_declaration_list l_ac_declaration_list_1 =
	    ac_declaration_list_1->rewrite(kc_current_view_base);
	if ((l_ac_declaration_1 == ac_declaration_1) &&  (l_ac_declaration_list_1 == ac_declaration_list_1))
	    return this;
	else {
	    impl_ac_declaration_list* kc_result= Consac_declaration_list(l_ac_declaration_1, l_ac_declaration_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_declaration_specifiers impl_ac_declaration_specifiers::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_declaration_specifier l_ac_declaration_specifier_1 =
	    ac_declaration_specifier_1->rewrite(kc_current_view_base);
	ac_declaration_specifiers l_ac_declaration_specifiers_1 =
	    ac_declaration_specifiers_1->rewrite(kc_current_view_base);
	if ((l_ac_declaration_specifier_1 == ac_declaration_specifier_1) &&  (l_ac_declaration_specifiers_1 == ac_declaration_specifiers_1))
	    return this;
	else {
	    impl_ac_declaration_specifiers* kc_result= Consac_declaration_specifiers(l_ac_declaration_specifier_1, l_ac_declaration_specifiers_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_declaration_specifier impl_ac_declaration_specifier_AcDeclSpecTypeQual::rewrite(rview kc_current_view_base)
{
    ac_type_qualifier l_ac_type_qualifier_1 =
	ac_type_qualifier_1->rewrite(kc_current_view_base);
    if ((l_ac_type_qualifier_1 == ac_type_qualifier_1))
	return this;
    else {
	impl_ac_declaration_specifier_AcDeclSpecTypeQual* kc_result= AcDeclSpecTypeQual(l_ac_type_qualifier_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_declaration_specifier impl_ac_declaration_specifier_AcDeclSpecTypeSpec::rewrite(rview kc_current_view_base)
{
    ac_type_specifier l_ac_type_specifier_1 =
	ac_type_specifier_1->rewrite(kc_current_view_base);
    if ((l_ac_type_specifier_1 == ac_type_specifier_1))
	return this;
    else {
	impl_ac_declaration_specifier_AcDeclSpecTypeSpec* kc_result= AcDeclSpecTypeSpec(l_ac_type_specifier_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_declaration_specifier impl_ac_declaration_specifier_AcDeclSpecStorageSpec::rewrite(rview kc_current_view_base)
{
    ac_storage_class_specifier l_ac_storage_class_specifier_1 =
	ac_storage_class_specifier_1->rewrite(kc_current_view_base);
    if ((l_ac_storage_class_specifier_1 == ac_storage_class_specifier_1))
	return this;
    else {
	impl_ac_declaration_specifier_AcDeclSpecStorageSpec* kc_result= AcDeclSpecStorageSpec(l_ac_storage_class_specifier_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_storage_class_specifier impl_ac_storage_class_specifier_AcVirtual::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_storage_class_specifier impl_ac_storage_class_specifier_AcTypedef::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_storage_class_specifier impl_ac_storage_class_specifier_AcExtern::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_storage_class_specifier impl_ac_storage_class_specifier_AcStatic::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_storage_class_specifier impl_ac_storage_class_specifier_AcRegister::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_storage_class_specifier impl_ac_storage_class_specifier_AcAuto::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_type_specifier impl_ac_type_specifier_AcTypeSpec::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_ac_type_specifier_AcTypeSpec* kc_result= AcTypeSpec(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_type_qualifier impl_ac_type_qualifier_AcNoQualifier::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_type_qualifier impl_ac_type_qualifier_AcUnsigned::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_type_qualifier impl_ac_type_qualifier_AcVolatile::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_type_qualifier impl_ac_type_qualifier_AcConst::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_init_declarator_list impl_ac_init_declarator_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_init_declarator l_ac_init_declarator_1 =
	    ac_init_declarator_1->rewrite(kc_current_view_base);
	ac_init_declarator_list l_ac_init_declarator_list_1 =
	    ac_init_declarator_list_1->rewrite(kc_current_view_base);
	if ((l_ac_init_declarator_1 == ac_init_declarator_1) &&  (l_ac_init_declarator_list_1 == ac_init_declarator_list_1))
	    return this;
	else {
	    impl_ac_init_declarator_list* kc_result= Consac_init_declarator_list(l_ac_init_declarator_1, l_ac_init_declarator_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_init_declarator impl_ac_init_declarator_AcInitDecl::rewrite(rview kc_current_view_base)
{
    ac_declarator l_ac_declarator_1 =
	ac_declarator_1->rewrite(kc_current_view_base);
    if ((l_ac_declarator_1 == ac_declarator_1))
	return this;
    else {
	impl_ac_init_declarator_AcInitDecl* kc_result= AcInitDecl(l_ac_declarator_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_declarator impl_ac_declarator_AcDeclarator::rewrite(rview kc_current_view_base)
{
    ac_pointer_option l_ac_pointer_option_1 =
	ac_pointer_option_1->rewrite(kc_current_view_base);
    ac_ref_option l_ac_ref_option_1 =
	ac_ref_option_1->rewrite(kc_current_view_base);
    ac_direct_declarator l_ac_direct_declarator_1 =
	ac_direct_declarator_1->rewrite(kc_current_view_base);
    if ((l_ac_pointer_option_1 == ac_pointer_option_1) &&  (l_ac_ref_option_1 == ac_ref_option_1) &&  (l_ac_direct_declarator_1 == ac_direct_declarator_1))
	return this;
    else {
	impl_ac_declarator_AcDeclarator* kc_result= AcDeclarator(l_ac_pointer_option_1, l_ac_ref_option_1, l_ac_direct_declarator_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcOperatorDeclId::rewrite(rview kc_current_view_base)
{
    ac_operator_name l_ac_operator_name_1 =
	ac_operator_name_1->rewrite(kc_current_view_base);
    if ((l_ac_operator_name_1 == ac_operator_name_1))
	return this;
    else {
	impl_ac_direct_declarator_AcOperatorDeclId* kc_result= AcOperatorDeclId(l_ac_operator_name_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcConvOperatorDecl::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_ID_2 == ID_2))
	return this;
    else {
	impl_ac_direct_declarator_AcConvOperatorDecl* kc_result= AcConvOperatorDecl(l_ID_1, l_ID_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcMemberDecl::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    ac_constant_expression_list l_ac_constant_expression_list_1 =
	ac_constant_expression_list_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_ID_2 == ID_2) &&  (l_ac_constant_expression_list_1 == ac_constant_expression_list_1))
	return this;
    else {
	impl_ac_direct_declarator_AcMemberDecl* kc_result= AcMemberDecl(l_ID_1, l_ID_2, l_ac_constant_expression_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcQualifiedDeclProto::rewrite(rview kc_current_view_base)
{
    ac_class_qualifier_list l_ac_class_qualifier_list_1 =
	ac_class_qualifier_list_1->rewrite(kc_current_view_base);
    ac_direct_declarator l_ac_direct_declarator_1 =
	ac_direct_declarator_1->rewrite(kc_current_view_base);
    ac_parameter_type_list l_ac_parameter_type_list_1 =
	ac_parameter_type_list_1->rewrite(kc_current_view_base);
    ac_type_qualifier l_ac_type_qualifier_1 =
	ac_type_qualifier_1->rewrite(kc_current_view_base);
    if ((l_ac_class_qualifier_list_1 == ac_class_qualifier_list_1) &&  (l_ac_direct_declarator_1 == ac_direct_declarator_1) &&  (l_ac_parameter_type_list_1 == ac_parameter_type_list_1) &&  (l_ac_type_qualifier_1 == ac_type_qualifier_1))
	return this;
    else {
	impl_ac_direct_declarator_AcQualifiedDeclProto* kc_result= AcQualifiedDeclProto(l_ac_class_qualifier_list_1, l_ac_direct_declarator_1, l_ac_parameter_type_list_1, l_ac_type_qualifier_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcDirectDeclProto::rewrite(rview kc_current_view_base)
{
    ac_direct_declarator l_ac_direct_declarator_1 =
	ac_direct_declarator_1->rewrite(kc_current_view_base);
    ac_parameter_type_list l_ac_parameter_type_list_1 =
	ac_parameter_type_list_1->rewrite(kc_current_view_base);
    if ((l_ac_direct_declarator_1 == ac_direct_declarator_1) &&  (l_ac_parameter_type_list_1 == ac_parameter_type_list_1))
	return this;
    else {
	impl_ac_direct_declarator_AcDirectDeclProto* kc_result= AcDirectDeclProto(l_ac_direct_declarator_1, l_ac_parameter_type_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcDirectDeclArray::rewrite(rview kc_current_view_base)
{
    ac_direct_declarator l_ac_direct_declarator_1 =
	ac_direct_declarator_1->rewrite(kc_current_view_base);
    ac_constant_expression_option l_ac_constant_expression_option_1 =
	ac_constant_expression_option_1->rewrite(kc_current_view_base);
    if ((l_ac_direct_declarator_1 == ac_direct_declarator_1) &&  (l_ac_constant_expression_option_1 == ac_constant_expression_option_1))
	return this;
    else {
	impl_ac_direct_declarator_AcDirectDeclArray* kc_result= AcDirectDeclArray(l_ac_direct_declarator_1, l_ac_constant_expression_option_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcDirectDeclPack::rewrite(rview kc_current_view_base)
{
    ac_declarator l_ac_declarator_1 =
	ac_declarator_1->rewrite(kc_current_view_base);
    if ((l_ac_declarator_1 == ac_declarator_1))
	return this;
    else {
	impl_ac_direct_declarator_AcDirectDeclPack* kc_result= AcDirectDeclPack(l_ac_declarator_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_declarator impl_ac_direct_declarator_AcDirectDeclId::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1))
	return this;
    else {
	impl_ac_direct_declarator_AcDirectDeclId* kc_result= AcDirectDeclId(l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_pointer_option impl_ac_pointer_option_Yespointer::rewrite(rview kc_current_view_base)
{
    ac_pointer l_ac_pointer_1 =
	ac_pointer_1->rewrite(kc_current_view_base);
    if ((l_ac_pointer_1 == ac_pointer_1))
	return this;
    else {
	impl_ac_pointer_option_Yespointer* kc_result= Yespointer(l_ac_pointer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_pointer_option impl_ac_pointer_option_Nopointer::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_pointer impl_ac_pointer_AcPointerCons::rewrite(rview kc_current_view_base)
{
    ac_type_qualifier_list l_ac_type_qualifier_list_1 =
	ac_type_qualifier_list_1->rewrite(kc_current_view_base);
    ac_pointer l_ac_pointer_1 =
	ac_pointer_1->rewrite(kc_current_view_base);
    if ((l_ac_type_qualifier_list_1 == ac_type_qualifier_list_1) &&  (l_ac_pointer_1 == ac_pointer_1))
	return this;
    else {
	impl_ac_pointer_AcPointerCons* kc_result= AcPointerCons(l_ac_type_qualifier_list_1, l_ac_pointer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_pointer impl_ac_pointer_AcPointerNil::rewrite(rview kc_current_view_base)
{
    ac_type_qualifier_list l_ac_type_qualifier_list_1 =
	ac_type_qualifier_list_1->rewrite(kc_current_view_base);
    if ((l_ac_type_qualifier_list_1 == ac_type_qualifier_list_1))
	return this;
    else {
	impl_ac_pointer_AcPointerNil* kc_result= AcPointerNil(l_ac_type_qualifier_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_ref_option impl_ac_ref_option_AcRef::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_ref_option impl_ac_ref_option_AcNoRef::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_operator_name impl_ac_operator_name_AcOperatorName::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_ac_operator_name_AcOperatorName* kc_result= AcOperatorName(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_class_qualifier_help_list impl_ac_class_qualifier_help_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_direct_declarator l_ac_direct_declarator_1 =
	    ac_direct_declarator_1->rewrite(kc_current_view_base);
	ac_class_qualifier_help_list l_ac_class_qualifier_help_list_1 =
	    ac_class_qualifier_help_list_1->rewrite(kc_current_view_base);
	if ((l_ac_direct_declarator_1 == ac_direct_declarator_1) &&  (l_ac_class_qualifier_help_list_1 == ac_class_qualifier_help_list_1))
	    return this;
	else {
	    impl_ac_class_qualifier_help_list* kc_result= Consac_class_qualifier_help_list(l_ac_direct_declarator_1, l_ac_class_qualifier_help_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_class_qualifier_list impl_ac_class_qualifier_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	ac_class_qualifier_list l_ac_class_qualifier_list_1 =
	    ac_class_qualifier_list_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_ac_class_qualifier_list_1 == ac_class_qualifier_list_1))
	    return this;
	else {
	    impl_ac_class_qualifier_list* kc_result= Consac_class_qualifier_list(l_ID_1, l_ac_class_qualifier_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_type_qualifier_list impl_ac_type_qualifier_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_type_qualifier l_ac_type_qualifier_1 =
	    ac_type_qualifier_1->rewrite(kc_current_view_base);
	ac_type_qualifier_list l_ac_type_qualifier_list_1 =
	    ac_type_qualifier_list_1->rewrite(kc_current_view_base);
	if ((l_ac_type_qualifier_1 == ac_type_qualifier_1) &&  (l_ac_type_qualifier_list_1 == ac_type_qualifier_list_1))
	    return this;
	else {
	    impl_ac_type_qualifier_list* kc_result= Consac_type_qualifier_list(l_ac_type_qualifier_1, l_ac_type_qualifier_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_parameter_type_list impl_ac_parameter_type_list_AcParList3Dot::rewrite(rview kc_current_view_base)
{
    ac_parameter_list l_ac_parameter_list_1 =
	ac_parameter_list_1->rewrite(kc_current_view_base);
    if ((l_ac_parameter_list_1 == ac_parameter_list_1))
	return this;
    else {
	impl_ac_parameter_type_list_AcParList3Dot* kc_result= AcParList3Dot(l_ac_parameter_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_parameter_type_list impl_ac_parameter_type_list_AcParList::rewrite(rview kc_current_view_base)
{
    ac_parameter_list l_ac_parameter_list_1 =
	ac_parameter_list_1->rewrite(kc_current_view_base);
    if ((l_ac_parameter_list_1 == ac_parameter_list_1))
	return this;
    else {
	impl_ac_parameter_type_list_AcParList* kc_result= AcParList(l_ac_parameter_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_parameter_list impl_ac_parameter_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_parameter_declaration l_ac_parameter_declaration_1 =
	    ac_parameter_declaration_1->rewrite(kc_current_view_base);
	ac_parameter_list l_ac_parameter_list_1 =
	    ac_parameter_list_1->rewrite(kc_current_view_base);
	if ((l_ac_parameter_declaration_1 == ac_parameter_declaration_1) &&  (l_ac_parameter_list_1 == ac_parameter_list_1))
	    return this;
	else {
	    impl_ac_parameter_list* kc_result= Consac_parameter_list(l_ac_parameter_declaration_1, l_ac_parameter_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_parameter_declaration impl_ac_parameter_declaration_AcParDeclAbsdecl::rewrite(rview kc_current_view_base)
{
    ac_declaration_specifiers l_ac_declaration_specifiers_1 =
	ac_declaration_specifiers_1->rewrite(kc_current_view_base);
    ac_abstract_declarator l_ac_abstract_declarator_1 =
	ac_abstract_declarator_1->rewrite(kc_current_view_base);
    ac_constant_expression_option l_ac_constant_expression_option_1 =
	ac_constant_expression_option_1->rewrite(kc_current_view_base);
    if ((l_ac_declaration_specifiers_1 == ac_declaration_specifiers_1) &&  (l_ac_abstract_declarator_1 == ac_abstract_declarator_1) &&  (l_ac_constant_expression_option_1 == ac_constant_expression_option_1))
	return this;
    else {
	impl_ac_parameter_declaration_AcParDeclAbsdecl* kc_result= AcParDeclAbsdecl(l_ac_declaration_specifiers_1, l_ac_abstract_declarator_1, l_ac_constant_expression_option_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_parameter_declaration impl_ac_parameter_declaration_AcParDeclDecl::rewrite(rview kc_current_view_base)
{
    ac_declaration_specifiers l_ac_declaration_specifiers_1 =
	ac_declaration_specifiers_1->rewrite(kc_current_view_base);
    ac_declarator l_ac_declarator_1 =
	ac_declarator_1->rewrite(kc_current_view_base);
    ac_constant_expression_option l_ac_constant_expression_option_1 =
	ac_constant_expression_option_1->rewrite(kc_current_view_base);
    if ((l_ac_declaration_specifiers_1 == ac_declaration_specifiers_1) &&  (l_ac_declarator_1 == ac_declarator_1) &&  (l_ac_constant_expression_option_1 == ac_constant_expression_option_1))
	return this;
    else {
	impl_ac_parameter_declaration_AcParDeclDecl* kc_result= AcParDeclDecl(l_ac_declaration_specifiers_1, l_ac_declarator_1, l_ac_constant_expression_option_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_identifier_list impl_ac_identifier_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	ac_identifier_list l_ac_identifier_list_1 =
	    ac_identifier_list_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_ac_identifier_list_1 == ac_identifier_list_1))
	    return this;
	else {
	    impl_ac_identifier_list* kc_result= Consac_identifier_list(l_ID_1, l_ac_identifier_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_abstract_declarator impl_ac_abstract_declarator_AcAbsdeclDirdecl::rewrite(rview kc_current_view_base)
{
    ac_pointer_option l_ac_pointer_option_1 =
	ac_pointer_option_1->rewrite(kc_current_view_base);
    ac_direct_abstract_declarator l_ac_direct_abstract_declarator_1 =
	ac_direct_abstract_declarator_1->rewrite(kc_current_view_base);
    if ((l_ac_pointer_option_1 == ac_pointer_option_1) &&  (l_ac_direct_abstract_declarator_1 == ac_direct_abstract_declarator_1))
	return this;
    else {
	impl_ac_abstract_declarator_AcAbsdeclDirdecl* kc_result= AcAbsdeclDirdecl(l_ac_pointer_option_1, l_ac_direct_abstract_declarator_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_abstract_declarator impl_ac_abstract_declarator_AcAbsdeclPointer::rewrite(rview kc_current_view_base)
{
    ac_pointer l_ac_pointer_1 =
	ac_pointer_1->rewrite(kc_current_view_base);
    if ((l_ac_pointer_1 == ac_pointer_1))
	return this;
    else {
	impl_ac_abstract_declarator_AcAbsdeclPointer* kc_result= AcAbsdeclPointer(l_ac_pointer_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_abstract_declarator_option impl_ac_direct_abstract_declarator_option_Yesac_direct_abstract_declarator::rewrite(rview kc_current_view_base)
{
    ac_direct_abstract_declarator l_ac_direct_abstract_declarator_1 =
	ac_direct_abstract_declarator_1->rewrite(kc_current_view_base);
    if ((l_ac_direct_abstract_declarator_1 == ac_direct_abstract_declarator_1))
	return this;
    else {
	impl_ac_direct_abstract_declarator_option_Yesac_direct_abstract_declarator* kc_result= Yesac_direct_abstract_declarator(l_ac_direct_abstract_declarator_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_abstract_declarator_option impl_ac_direct_abstract_declarator_option_Noac_direct_abstract_declarator::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_direct_abstract_declarator impl_ac_direct_abstract_declarator_AcDirAbsdeclFn::rewrite(rview kc_current_view_base)
{
    ac_direct_abstract_declarator_option l_ac_direct_abstract_declarator_option_1 =
	ac_direct_abstract_declarator_option_1->rewrite(kc_current_view_base);
    ac_parameter_type_list l_ac_parameter_type_list_1 =
	ac_parameter_type_list_1->rewrite(kc_current_view_base);
    if ((l_ac_direct_abstract_declarator_option_1 == ac_direct_abstract_declarator_option_1) &&  (l_ac_parameter_type_list_1 == ac_parameter_type_list_1))
	return this;
    else {
	impl_ac_direct_abstract_declarator_AcDirAbsdeclFn* kc_result= AcDirAbsdeclFn(l_ac_direct_abstract_declarator_option_1, l_ac_parameter_type_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_abstract_declarator impl_ac_direct_abstract_declarator_AcDirAbsdeclArray::rewrite(rview kc_current_view_base)
{
    ac_direct_abstract_declarator_option l_ac_direct_abstract_declarator_option_1 =
	ac_direct_abstract_declarator_option_1->rewrite(kc_current_view_base);
    ac_constant_expression_option l_ac_constant_expression_option_1 =
	ac_constant_expression_option_1->rewrite(kc_current_view_base);
    if ((l_ac_direct_abstract_declarator_option_1 == ac_direct_abstract_declarator_option_1) &&  (l_ac_constant_expression_option_1 == ac_constant_expression_option_1))
	return this;
    else {
	impl_ac_direct_abstract_declarator_AcDirAbsdeclArray* kc_result= AcDirAbsdeclArray(l_ac_direct_abstract_declarator_option_1, l_ac_constant_expression_option_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_direct_abstract_declarator impl_ac_direct_abstract_declarator_AcDirAbsdeclPack::rewrite(rview kc_current_view_base)
{
    ac_abstract_declarator l_ac_abstract_declarator_1 =
	ac_abstract_declarator_1->rewrite(kc_current_view_base);
    if ((l_ac_abstract_declarator_1 == ac_abstract_declarator_1))
	return this;
    else {
	impl_ac_direct_abstract_declarator_AcDirAbsdeclPack* kc_result= AcDirAbsdeclPack(l_ac_abstract_declarator_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_constant_expression_option impl_ac_constant_expression_option_Noac_constant_expression::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_constant_expression_option impl_ac_constant_expression_option_Yesac_constant_expression::rewrite(rview kc_current_view_base)
{
    ac_constant_expression l_ac_constant_expression_1 =
	ac_constant_expression_1->rewrite(kc_current_view_base);
    if ((l_ac_constant_expression_1 == ac_constant_expression_1))
	return this;
    else {
	impl_ac_constant_expression_option_Yesac_constant_expression* kc_result= Yesac_constant_expression(l_ac_constant_expression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_constant_expression impl_ac_constant_expression_AcConstExpr::rewrite(rview kc_current_view_base)
{
    Cexpression l_Cexpression_1 =
	Cexpression_1->rewrite(kc_current_view_base);
    if ((l_Cexpression_1 == Cexpression_1))
	return this;
    else {
	impl_ac_constant_expression_AcConstExpr* kc_result= AcConstExpr(l_Cexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_constant_expression_list impl_ac_constant_expression_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_constant_expression l_ac_constant_expression_1 =
	    ac_constant_expression_1->rewrite(kc_current_view_base);
	ac_constant_expression_list l_ac_constant_expression_list_1 =
	    ac_constant_expression_list_1->rewrite(kc_current_view_base);
	if ((l_ac_constant_expression_1 == ac_constant_expression_1) &&  (l_ac_constant_expression_list_1 == ac_constant_expression_list_1))
	    return this;
	else {
	    impl_ac_constant_expression_list* kc_result= Consac_constant_expression_list(l_ac_constant_expression_1, l_ac_constant_expression_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_opt_base_init_list impl_ac_opt_base_init_list_AcYesBaseInit::rewrite(rview kc_current_view_base)
{
    ac_base_init_list l_ac_base_init_list_1 =
	ac_base_init_list_1->rewrite(kc_current_view_base);
    if ((l_ac_base_init_list_1 == ac_base_init_list_1))
	return this;
    else {
	impl_ac_opt_base_init_list_AcYesBaseInit* kc_result= AcYesBaseInit(l_ac_base_init_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

ac_opt_base_init_list impl_ac_opt_base_init_list_AcNoBaseInit::rewrite(rview kc_current_view_base)
{
    return this;

}

ac_base_init_list impl_ac_base_init_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ac_base_init l_ac_base_init_1 =
	    ac_base_init_1->rewrite(kc_current_view_base);
	ac_base_init_list l_ac_base_init_list_1 =
	    ac_base_init_list_1->rewrite(kc_current_view_base);
	if ((l_ac_base_init_1 == ac_base_init_1) &&  (l_ac_base_init_list_1 == ac_base_init_list_1))
	    return this;
	else {
	    impl_ac_base_init_list* kc_result= Consac_base_init_list(l_ac_base_init_1, l_ac_base_init_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

ac_base_init impl_ac_base_init_AcBaseInit::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    ac_constant_expression l_ac_constant_expression_1 =
	ac_constant_expression_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_ac_constant_expression_1 == ac_constant_expression_1))
	return this;
    else {
	impl_ac_base_init_AcBaseInit* kc_result= AcBaseInit(l_ID_1, l_ac_constant_expression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

baseclass_declarations impl_baseclass_declarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	baseclass_decl l_baseclass_decl_1 =
	    baseclass_decl_1->rewrite(kc_current_view_base);
	baseclass_declarations l_baseclass_declarations_1 =
	    baseclass_declarations_1->rewrite(kc_current_view_base);
	if ((l_baseclass_decl_1 == baseclass_decl_1) &&  (l_baseclass_declarations_1 == baseclass_declarations_1))
	    return this;
	else {
	    impl_baseclass_declarations* kc_result= Consbaseclass_declarations(l_baseclass_decl_1, l_baseclass_declarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

baseclass_decl impl_baseclass_decl_BaseClassDecl::rewrite(rview kc_current_view_base)
{
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    baseclass_list l_baseclass_list_1 =
	baseclass_list_1->rewrite(kc_current_view_base);
    if ((l_ID_1 == ID_1) &&  (l_baseclass_list_1 == baseclass_list_1))
	return this;
    else {
	impl_baseclass_decl_BaseClassDecl* kc_result= BaseClassDecl(l_ID_1, l_baseclass_list_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

baseclass_list impl_baseclass_list::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	ID l_ID_1 =
	    ID_1->rewrite(kc_current_view_base);
	baseclass_list l_baseclass_list_1 =
	    baseclass_list_1->rewrite(kc_current_view_base);
	if ((l_ID_1 == ID_1) &&  (l_baseclass_list_1 == baseclass_list_1))
	    return this;
	else {
	    impl_baseclass_list* kc_result= Consbaseclass_list(l_ID_1, l_baseclass_list_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

error impl_error_Warning::rewrite(rview kc_current_view_base)
{
    fileline l_fileline_1 =
	fileline_1->rewrite(kc_current_view_base);
    problem l_problem_1 =
	problem_1->rewrite(kc_current_view_base);
    if ((l_fileline_1 == fileline_1) &&  (l_problem_1 == problem_1))
	return this;
    else {
	impl_error_Warning* kc_result= Warning(l_fileline_1, l_problem_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

error impl_error_NonFatal::rewrite(rview kc_current_view_base)
{
    fileline l_fileline_1 =
	fileline_1->rewrite(kc_current_view_base);
    problem l_problem_1 =
	problem_1->rewrite(kc_current_view_base);
    if ((l_fileline_1 == fileline_1) &&  (l_problem_1 == problem_1))
	return this;
    else {
	impl_error_NonFatal* kc_result= NonFatal(l_fileline_1, l_problem_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

error impl_error_Fatal::rewrite(rview kc_current_view_base)
{
    fileline l_fileline_1 =
	fileline_1->rewrite(kc_current_view_base);
    problem l_problem_1 =
	problem_1->rewrite(kc_current_view_base);
    if ((l_fileline_1 == fileline_1) &&  (l_problem_1 == problem_1))
	return this;
    else {
	impl_error_Fatal* kc_result= Fatal(l_fileline_1, l_problem_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem6::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    casestring l_casestring_4 =
	casestring_4->rewrite(kc_current_view_base);
    casestring l_casestring_5 =
	casestring_5->rewrite(kc_current_view_base);
    casestring l_casestring_6 =
	casestring_6->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_casestring_2 == casestring_2) &&  (l_casestring_3 == casestring_3) &&  (l_casestring_4 == casestring_4) &&  (l_casestring_5 == casestring_5) &&  (l_casestring_6 == casestring_6))
	return this;
    else {
	impl_problem_Problem6* kc_result= Problem6(l_casestring_1, l_casestring_2, l_casestring_3, l_casestring_4, l_casestring_5, l_casestring_6);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem5::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    casestring l_casestring_4 =
	casestring_4->rewrite(kc_current_view_base);
    casestring l_casestring_5 =
	casestring_5->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_casestring_2 == casestring_2) &&  (l_casestring_3 == casestring_3) &&  (l_casestring_4 == casestring_4) &&  (l_casestring_5 == casestring_5))
	return this;
    else {
	impl_problem_Problem5* kc_result= Problem5(l_casestring_1, l_casestring_2, l_casestring_3, l_casestring_4, l_casestring_5);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem4::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    casestring l_casestring_4 =
	casestring_4->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_casestring_2 == casestring_2) &&  (l_casestring_3 == casestring_3) &&  (l_casestring_4 == casestring_4))
	return this;
    else {
	impl_problem_Problem4* kc_result= Problem4(l_casestring_1, l_casestring_2, l_casestring_3, l_casestring_4);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem3int1::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    casestring l_casestring_4 =
	casestring_4->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_casestring_2 == casestring_2) &&  (l_casestring_3 == casestring_3) &&  (l_integer_1 == integer_1) &&  (l_casestring_4 == casestring_4))
	return this;
    else {
	impl_problem_Problem3int1* kc_result= Problem3int1(l_casestring_1, l_casestring_2, l_casestring_3, l_integer_1, l_casestring_4);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem3::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_casestring_2 == casestring_2) &&  (l_casestring_3 == casestring_3))
	return this;
    else {
	impl_problem_Problem3* kc_result= Problem3(l_casestring_1, l_casestring_2, l_casestring_3);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem2::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_casestring_2 == casestring_2))
	return this;
    else {
	impl_problem_Problem2* kc_result= Problem2(l_casestring_1, l_casestring_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1storageoption1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    storageoption l_storageoption_1 =
	storageoption_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_storageoption_1 == storageoption_1) &&  (l_casestring_2 == casestring_2) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_problem_Problem1storageoption1ID* kc_result= Problem1storageoption1ID(l_casestring_1, l_storageoption_1, l_casestring_2, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1INT1ID1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_INT_1 == INT_1) &&  (l_casestring_2 == casestring_2) &&  (l_ID_1 == ID_1) &&  (l_casestring_3 == casestring_3) &&  (l_ID_2 == ID_2))
	return this;
    else {
	impl_problem_Problem1INT1ID1ID* kc_result= Problem1INT1ID1ID(l_casestring_1, l_INT_1, l_casestring_2, l_ID_1, l_casestring_3, l_ID_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1ID1ID1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    casestring l_casestring_3 =
	casestring_3->rewrite(kc_current_view_base);
    ID l_ID_3 =
	ID_3->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_ID_1 == ID_1) &&  (l_casestring_2 == casestring_2) &&  (l_ID_2 == ID_2) &&  (l_casestring_3 == casestring_3) &&  (l_ID_3 == ID_3))
	return this;
    else {
	impl_problem_Problem1ID1ID1ID* kc_result= Problem1ID1ID1ID(l_casestring_1, l_ID_1, l_casestring_2, l_ID_2, l_casestring_3, l_ID_3);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1INT1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_INT_1 == INT_1) &&  (l_casestring_2 == casestring_2) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_problem_Problem1INT1ID* kc_result= Problem1INT1ID(l_casestring_1, l_INT_1, l_casestring_2, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1int1::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    integer l_integer_1 =
	integer_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_integer_1 == integer_1) &&  (l_casestring_2 == casestring_2))
	return this;
    else {
	impl_problem_Problem1int1* kc_result= Problem1int1(l_casestring_1, l_integer_1, l_casestring_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1INT::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    INT l_INT_1 =
	INT_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_INT_1 == INT_1))
	return this;
    else {
	impl_problem_Problem1INT* kc_result= Problem1INT(l_casestring_1, l_INT_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1t1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    IDtype l_IDtype_1 =
	IDtype_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_IDtype_1 == IDtype_1) &&  (l_casestring_2 == casestring_2) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_problem_Problem1t1ID* kc_result= Problem1t1ID(l_casestring_1, l_IDtype_1, l_casestring_2, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1ID1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    casestring l_casestring_2 =
	casestring_2->rewrite(kc_current_view_base);
    ID l_ID_2 =
	ID_2->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_ID_1 == ID_1) &&  (l_casestring_2 == casestring_2) &&  (l_ID_2 == ID_2))
	return this;
    else {
	impl_problem_Problem1ID1ID* kc_result= Problem1ID1ID(l_casestring_1, l_ID_1, l_casestring_2, l_ID_2);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1we::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    withexpression l_withexpression_1 =
	withexpression_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_withexpression_1 == withexpression_1))
	return this;
    else {
	impl_problem_Problem1we* kc_result= Problem1we(l_casestring_1, l_withexpression_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1tID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_problem_Problem1tID* kc_result= Problem1tID(l_casestring_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1ID::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    ID l_ID_1 =
	ID_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1) &&  (l_ID_1 == ID_1))
	return this;
    else {
	impl_problem_Problem1ID* kc_result= Problem1ID(l_casestring_1, l_ID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

problem impl_problem_Problem1::rewrite(rview kc_current_view_base)
{
    casestring l_casestring_1 =
	casestring_1->rewrite(kc_current_view_base);
    if ((l_casestring_1 == casestring_1))
	return this;
    else {
	impl_problem_Problem1* kc_result= Problem1(l_casestring_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

addedphylumdeclarations impl_addedphylumdeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	addedphylumdeclaration l_addedphylumdeclaration_1 =
	    addedphylumdeclaration_1->rewrite(kc_current_view_base);
	addedphylumdeclarations l_addedphylumdeclarations_1 =
	    addedphylumdeclarations_1->rewrite(kc_current_view_base);
	if ((l_addedphylumdeclaration_1 == addedphylumdeclaration_1) &&  (l_addedphylumdeclarations_1 == addedphylumdeclarations_1))
	    return this;
	else {
	    impl_addedphylumdeclarations* kc_result= Consaddedphylumdeclarations(l_addedphylumdeclaration_1, l_addedphylumdeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

addedphylumdeclaration impl_addedphylumdeclaration_AddedPhylumdeclaration::rewrite(rview kc_current_view_base)
{
    uniqID l_uniqID_1 =
	uniqID_1->rewrite(kc_current_view_base);
    if ((l_uniqID_1 == uniqID_1))
	return this;
    else {
	impl_addedphylumdeclaration_AddedPhylumdeclaration* kc_result= AddedPhylumdeclaration(l_uniqID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

countedphylumdeclarations impl_countedphylumdeclarations::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	countedphylumdeclaration l_countedphylumdeclaration_1 =
	    countedphylumdeclaration_1->rewrite(kc_current_view_base);
	countedphylumdeclarations l_countedphylumdeclarations_1 =
	    countedphylumdeclarations_1->rewrite(kc_current_view_base);
	if ((l_countedphylumdeclaration_1 == countedphylumdeclaration_1) &&  (l_countedphylumdeclarations_1 == countedphylumdeclarations_1))
	    return this;
	else {
	    impl_countedphylumdeclarations* kc_result= Conscountedphylumdeclarations(l_countedphylumdeclaration_1, l_countedphylumdeclarations_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

countedphylumdeclaration impl_countedphylumdeclaration_CountedPhylumdeclaration::rewrite(rview kc_current_view_base)
{
    uniqID l_uniqID_1 =
	uniqID_1->rewrite(kc_current_view_base);
    if ((l_uniqID_1 == uniqID_1))
	return this;
    else {
	impl_countedphylumdeclaration_CountedPhylumdeclaration* kc_result= CountedPhylumdeclaration(l_uniqID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

charruns impl_charruns_Stars::rewrite(rview kc_current_view_base)
{
    return this;

}

charruns impl_charruns_QuotedNewlines::rewrite(rview kc_current_view_base)
{
    return this;

}

charruns impl_charruns_Newlines::rewrite(rview kc_current_view_base)
{
    return this;

}

bindingidmarks impl_bindingidmarks::rewrite(rview kc_current_view_base)
{
    if (is_nil()) {
	return this;
    } else { // not Nil, Cons
	bindingidmark l_bindingidmark_1 =
	    bindingidmark_1->rewrite(kc_current_view_base);
	bindingidmarks l_bindingidmarks_1 =
	    bindingidmarks_1->rewrite(kc_current_view_base);
	if ((l_bindingidmark_1 == bindingidmark_1) &&  (l_bindingidmarks_1 == bindingidmarks_1))
	    return this;
	else {
	    impl_bindingidmarks* kc_result= Consbindingidmarks(l_bindingidmark_1, l_bindingidmarks_1);
	    kc_result->rewrite_members(this);
	    return kc_result;
	}   }
}

bindingidmark impl_bindingidmark_BindingIdMark::rewrite(rview kc_current_view_base)
{
    uniqID l_uniqID_1 =
	uniqID_1->rewrite(kc_current_view_base);
    if ((l_uniqID_1 == uniqID_1))
	return this;
    else {
	impl_bindingidmark_BindingIdMark* kc_result= BindingIdMark(l_uniqID_1);
	kc_result->rewrite_members(this);
	return kc_result;
    }
}

} // namespace kc
