/* translation of file "parse.k" */
/* generated by:
 *  @(#)$Author$
 */
#ifndef KC_FUNCTIONS_parse_HEADER
#define KC_FUNCTIONS_parse_HEADER
#include "k.h"    /* in case a user forgets */

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 {
phylumdeclarations mergephylumdeclarations (phylumdeclaration pd, phylumdeclarations pds);
alternatives makeListAlternatives (ID listphylum, ID elementphylum);
const char *f_strofID (ID id);
phylumdeclaration f_lookupuserdecl (ID id);
phylumdeclaration f_lookupdecl (ID id);
argsnumbers insert_in_argsnumbers (int i, argsnumbers a);
void set_includefiles (includefiles ifs, includedeclaration i);
languagenames merge_languagenames (languagenames names, languagenames name_list);
long get_text_nr ();
void inc_text_nr ();
long last_text_nr ();
ID f_ID_of_declarator (ac_declarator d);
ID f_ID_of_fn_declarator (ac_declarator d, fnclass fnc);
int f_stars_of_declarator (ac_declarator d);
fnclass f_fnclass_info (ac_declaration_specifiers ds, casestring fn, ac_declarator dec);
fnclass f_member_class_info (ac_declaration_specifiers ds, casestring fn);
bool f_static_in_ac_decl_specs (ac_declaration_specifiers ds);
ID f_ID_of_ac_declaration_specifiers (ac_declaration_specifiers d);
void check_no_patternchaingroup_in_patternchain (casestring f, int l, patternchain a_patternchain, const char *ctxt);
void check_no_patternchaingroup_in_patternchains (casestring f, int l, patternchains a_patternchains, const char *ctxt);
void check_no_patternchaingroup_or_pattern_in_patternchain (casestring f, int l, patternchain a_patternchain, const char *ctxt);
void check_no_patternchaingroup_or_pattern_in_patternchains (casestring f, int l, patternchains a_patternchains, const char *ctxt);
patternchains syn_patternchains_fileline (patternchains a_patternchains, casestring a_file, int a_line);
patternchain syn_patternchain_fileline (patternchain a_patternchain, casestring a_file, int a_line);
withexpressions pf_gen_foreachwith_vars (idCexpressions a_idCexpressions);
withexpressions pf_gen_foreachwith_listvars (idCexpressions a_idCexpressions);
withexpressions t_pf_gen_foreachwith_vars (idCexpressions a_idCexpressions, int occ, int nr, bool listvars);
ac_class_qualifier_list f_check_build_qualifier_tail (ac_class_qualifier_help_list qh_list);
ac_class_qualifier_list f_check_build_qualifier (ac_class_qualifier_help_list qh_list, ac_direct_declarator &decl);
ID subst_name (ID n, casestring oldname, casestring newname);

} // namespace kc

#endif // !  KC_FUNCTIONS_parse_HEADER

