diff options
Diffstat (limited to 'backendC/CleanCompilerSources/dbprint.c')
-rw-r--r-- | backendC/CleanCompilerSources/dbprint.c | 832 |
1 files changed, 832 insertions, 0 deletions
diff --git a/backendC/CleanCompilerSources/dbprint.c b/backendC/CleanCompilerSources/dbprint.c new file mode 100644 index 0000000..2e3fc36 --- /dev/null +++ b/backendC/CleanCompilerSources/dbprint.c @@ -0,0 +1,832 @@ + +#include "system.h" +#include "syntaxtr.t" +#include "comsupport.h" +#include "settings.h" +#include "sizes.h" +#include "checker.h" +#include "checksupport.h" +#include "overloading.h" +#include "dbprint.h" +#include "codegen_types.h" + +#define for_l(v,l,n) for(v=(l);v!=NULL;v=v->n) + +#define PrintAnnotation(annot) + +#undef PRINT_alt_lifted_node_ids +#undef PRINT_NODE_ID_REF_COUNTS +#define PRINT_ALL_NODE_ID_ADDRESSES +#undef PRINT_NODE_LINE_NUMBERS +#define PRINT_NODE_ID_REF_COUNT + +static void PrintUnaryState (StateKind kind, ObjectKind obj, File file) +{ + switch (kind) + { case OnB: FPutS ("OnB ", file); break; + case OnA: FPutS ("OnA ", file); break; + case StrictOnA: FPutS ("StrictOnA ", file); break; + case SemiStrict: FPutS ("SemiStrict ", file); break; + case StrictRedirection: FPutS ("StrictRedirection ", file); break; + case Parallel: FPutS ("Parallel ", file); break; + case Undefined: FPutS ("Undefined ", file); break; + case UnderEval: FPutS ("UnderEval ", file); break; + } + switch (obj) + { case UnknownObj: FPutS ("???", file); break; + case IntObj: FPutS ("Int ", file); break; + case BoolObj: FPutS ("Bool ", file); break; + case CharObj: FPutS ("Char ", file); break; + case StringObj: FPutS ("String ", file); break; + case RealObj: FPutS ("Real ", file); break; + case FileObj: FPutS ("File ", file); break; + case TupleObj: FPutS ("Tuple ", file); break; + case ListObj: FPutS ("List ", file); break; + case ProcIdObj: FPutS ("ProcId ", file); break; + } +} + +static void PrintState (StateS state, File file) +{ + return; + + if (state.state_arity == 1) + PrintUnaryState (state.state_kind,state.state_object, file); +} + +void DPrintOccurrenceKind (OccurrenceKind kind, File file) +{ + switch (kind) + { case NotUsed: /* FPutS ("NotUsed", file); */ return; + case UniquelyUsed: FPutS ("<U> ", file); return; + case SelectivelyUsed: FPutS ("<S> ", file); return; + case MultiplyUsed: FPutS ("<M> ", file); return; + default: FPutS ("<?> ", file); return; + } + +} + +void DPrintNodeId (NodeId nid, File file) +{ + if (nid){ + if (nid->nid_ident){ + FPrintF (file, "%s",nid->nid_ident->ident_name); +#ifdef PRINT_ALL_NODE_ID_ADDRESSES + FPrintF (file, "@i_%lx", (long) nid); +#endif + } else + FPrintF (file, "i_%lx", (long) nid); + +#ifdef PRINT_NODE_ID_REF_COUNT + FPrintF (file, "<%d>", nid->nid_refcount); +#endif + } else + FPrintF (file," 00000000"); +} + +void DPrintNodeIdS (char *s,NodeId node_id,File file) +{ + FPrintF (file,"%s",s); + DPrintNodeId (node_id,file); + FPrintF (file,"\n"); +} + +static void DPrintTypeVar (TypeVar tv, Node follow, File file) +{ + if (tv){ + if (tv->tv_ident) + FPrintF (file, "%s",tv->tv_ident->ident_name); + else + FPrintF (file, "i_%lx", (long) tv); + FPrintF (file, "<%d>", tv->tv_refcount); + if (follow) + FPutS (" = ", file); + } +} + +static void PrintArgument (Args arg,Bool brackets,int n_leading_spaces,File file) +{ + PrintState (arg->arg_state, file); + + if (arg->arg_node->node_kind==NodeIdNode) + DPrintNodeId (arg->arg_node->node_node_id,file); + else { + /* DPrintOccurrenceKind (arg -> arg_occurrence); */ + PrintRuleNode (arg->arg_node,brackets,n_leading_spaces,file); + } +} + +static void print_spaces (int n_leading_spaces,File file) +{ + int n; + + for (n=0; n<n_leading_spaces; ++n) + FPutC (' ',file); +} + +static void PrintArguments (Args args, char separator, Bool brackets,int n_leading_spaces,File file) +{ + if (args!=NULL){ + PrintArgument (args,brackets,n_leading_spaces,file); + for (args = args -> arg_next; args; args = args -> arg_next){ + FPutC (separator, file); + if (separator=='\n') + print_spaces (n_leading_spaces,file); + PrintArgument (args, brackets,n_leading_spaces,file); + } + } +} + +void PrintRuleNode (Node node,Bool brackets,int n_leading_spaces,File file) +{ +/* + if (IsOnACycle (node -> node_number)) + FPutS ("<C>", file); + PrintState (node -> node_state,file); +*/ + switch (node -> node_kind){ + case NormalNode: + case PrefixNode: + { + Symbol node_symb = node->node_symbol; + + if (node_symb -> symb_kind == tuple_symb){ + FPutC ('(', file); + PrintArguments (node -> node_arguments, ',', False,n_leading_spaces,file); + FPutC (')', file); + } + else if (node_symb -> symb_kind == list_type) + { FPutC ('[', file); + PrintArguments (node -> node_arguments, ',', False,n_leading_spaces,file); + FPutC (']', file); + } + else if (node_symb -> symb_kind == nil_symb) + FPutS ("[]", file); + else if (node_symb -> symb_kind == cons_symb) + { FPutC ('[', file); + PrintArgument (node -> node_arguments, brackets,n_leading_spaces,file); + FPutC (':', file); + PrintArgument (node -> node_arguments -> arg_next, brackets,n_leading_spaces,file); + FPutC (']', file); + } else if (node_symb -> symb_kind==select_symb){ + FPutS ("_sel",file); + FPutC ('0'+node->node_arity,file); + FPutC (' ',file); + PrintArgument (node -> node_arguments,True,n_leading_spaces,file); + } else { + if (brackets && node -> node_arguments) + FPutC ('(', file); + + PrintSymbol (node_symb, file); + +#ifdef PRINT_NODE_LINE_NUMBERS + FPrintF (file,"#%d",node->node_line); +#endif + if (node_symb->symb_kind==definition && node_symb->symb_def->sdef_kind==IMPRULE && + (node_symb->symb_def->sdef_rule->rule_mark & RULE_INTERNAL_FUNCTION_MASK)) + { + FPrintF (file,"_%d",node_symb->symb_def->sdef_number); + } + + if (node -> node_arguments) + { FPutC (' ', file); + PrintArguments (node -> node_arguments,' ', True,n_leading_spaces,file); + if (brackets) + FPutC (')', file); + } + } + break; + } + case SelectorNode: + PrintArgument (node -> node_arguments, True,n_leading_spaces,file); + if (node->node_arity>1){ + FPutC ('!',file); + FPutC ('0'+node->node_arity,file); + } else + FPutC ('.',file); + PrintSymbol (node->node_symbol, file); + break; + case IfNode: + { + Args elsepart, thenpart, condpart; + + condpart = node -> node_arguments; + thenpart = condpart -> arg_next; + elsepart = thenpart -> arg_next; + + if (brackets) + FPutC ('(', file); + + FPutS ("IF ", file); + PrintArgument (condpart, True,n_leading_spaces,file); + + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); +#if 1 +# ifdef PRINT_NODE_ID_REF_COUNTS + FPutS ("[ ", file); + { + NodeIdRefCountListP node_id_ref_count_elem; + + for_l (node_id_ref_count_elem,node->node_then_node_id_ref_counts,nrcl_next){ + DPrintNodeId (node_id_ref_count_elem->nrcl_node_id,file); + printf (" %d ",node_id_ref_count_elem->nrcl_ref_count); + } + } + FPutS ("]\n", file); + print_spaces (n_leading_spaces+4,file); +# else + if (node->node_then_strict_node_ids!=NULL){ + StrictNodeIdP strict_node_id; + + FPutS ("let! ", file); + + for_l (strict_node_id,node->node_then_strict_node_ids,snid_next){ + DPrintNodeId (strict_node_id->snid_node_id,file); + FPutS ("; ",file); + } + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); + } +# endif +#endif + PrintArgument (thenpart, True,n_leading_spaces+4,file); + + if (node->node_then_node_defs!=NULL){ + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); + FPutS ("{\n",file); + PrintNodeDefs (node->node_then_node_defs,n_leading_spaces+8,file); + print_spaces (n_leading_spaces+4,file); + FPutC ('}', file); + } + + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); + +#if 1 +# ifdef PRINT_NODE_ID_REF_COUNTS + FPutS ("[ ", file); + { + NodeIdRefCountListP node_id_ref_count_elem; + + for_l (node_id_ref_count_elem,node->node_else_node_id_ref_counts,nrcl_next){ + DPrintNodeId (node_id_ref_count_elem->nrcl_node_id,file); + printf (" %d ",node_id_ref_count_elem->nrcl_ref_count); + } + } + FPutS ("]\n",file); + print_spaces (n_leading_spaces+4,file); +# else + if (node->node_else_strict_node_ids!=NULL){ + StrictNodeIdP strict_node_id; + + FPutS ("let! ", file); + + for (strict_node_id=node->node_else_strict_node_ids; strict_node_id!=NULL; strict_node_id=strict_node_id->snid_next){ + DPrintNodeId (strict_node_id->snid_node_id,file); + FPutS ("; ",file); + } + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); + } +# endif +#endif + + PrintArgument (elsepart, True,n_leading_spaces+4,file); + + if (node->node_else_node_defs!=NULL){ + FPutC ('\n', file); + print_spaces (n_leading_spaces+4,file); + FPutS ("{\n",file); + PrintNodeDefs (node->node_else_node_defs,n_leading_spaces+8,file); + print_spaces (n_leading_spaces+4,file); + FPutS ("}\n", file); + print_spaces (n_leading_spaces,file); + } + + if (brackets) + FPutC (')', file); + break; + } + case NodeIdNode: + { + NodeId node_id; + + node_id=node->node_node_id; + + if (node_id->nid_ident){ + FPrintF (file, " %s<%d>",node_id->nid_ident->ident_name,node_id->nid_refcount); +#ifdef PRINT_ALL_NODE_ID_ADDRESSES + FPrintF (file, " i_%lx",(long) node_id); +#endif + } else + FPrintF (file, " i_%lx<%d>",(long) node_id,node_id->nid_refcount); + break; + } + case RecordNode: + if (brackets && node -> node_arguments) + FPutC ('(', file); + PrintSymbol (node->node_symbol, file); + if (node -> node_arguments){ + FPutC (' ', file); + PrintArguments (node -> node_arguments,' ', True,n_leading_spaces,file); + if (brackets) + FPutC (')', file); + } + break; + case IdentNode: + if (brackets && node -> node_arguments) + FPutC ('(', file); + + FPutC ('\"',file); + FPutS (node->node_ident->ident_name, file); + FPutC ('\"',file); + + if (node -> node_arguments){ + FPutC (' ', file); + PrintArguments (node -> node_arguments,' ', True,n_leading_spaces,file); + if (brackets) + FPutC (')', file); + } + break; + case UpdateNode: + { Args field = node -> node_arguments; + + FPutC ('{', file); + + PrintArgument (field, False,n_leading_spaces,file); + FPutS (" & ", file); + field = field -> arg_next; + PrintArgument (field, False,n_leading_spaces,file); + for (field = field -> arg_next; field; field = field -> arg_next) + { FPutC (',', file); + PrintArgument (field, False,n_leading_spaces,file); + } + + FPutC ('}', file); + break; + } + case MatchNode: + { + FPutS ("Match ",file); + PrintSymbol (node->node_symbol,file); + FPutC (' ',file); + PrintArgument (node->node_arguments,False,n_leading_spaces,file); + break; + } + case ApplyNode: + { + FPutS ("Apply ",file); + PrintRuleNode (node->node_node, False,n_leading_spaces,file); + FPutC (' ',file); + PrintArgument (node->node_arguments,False,n_leading_spaces,file); + break; + } + case SwitchNode: + FPutS ("Switch ",file); + DPrintNodeId (node->node_node_id,file); + FPutC ('\n',file); + print_spaces (n_leading_spaces,file); + PrintArguments (node->node_arguments,'\n',True,n_leading_spaces,file); + break; + case CaseNode: + FPutS ("Case: [ ",file); + { + NodeIdRefCountListP node_id_ref_count_elem; + + for_l (node_id_ref_count_elem,node->node_node_id_ref_counts,nrcl_next){ + DPrintNodeId (node_id_ref_count_elem->nrcl_node_id,file); + printf (" %d ",node_id_ref_count_elem->nrcl_ref_count); + } + } + FPutS ("]\n",file); + print_spaces (n_leading_spaces+4,file); + +#if 0 +# ifndef PRINT_NODE_ID_REF_COUNTS + if (node->node_strict_node_ids!=NULL){ + StrictNodeIdP strict_node_id; + + FPutS ("let! ", file); + + for_l (strict_node_id,node->node_strict_node_ids,snid_next){ + if (strict_node_id->snid_mark & STRICT_NODE_ID_IDENT_MASK){ + FPrintF (file, " %s",strict_node_id->snid_ident->ident_name); + } else { + DPrintNodeId (strict_node_id->snid_node_id,file); + FPutS ("; ",file); + } + } + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); + } +# endif +#endif + PrintArgument (node->node_arguments,False,n_leading_spaces+4,file); + + if (node->node_node_defs!=NULL){ + FPutC ('\n', file); + print_spaces (n_leading_spaces,file); + FPutS ("{\n",file); + PrintNodeDefs (node->node_node_defs,n_leading_spaces+4,file); + print_spaces (n_leading_spaces,file); + FPutS ("}\n", file); + print_spaces (n_leading_spaces,file); + } + + break; + case DefaultNode: + FPutS ("Default: [ ",file); + { + NodeIdRefCountListP node_id_ref_count_elem; + + for_l (node_id_ref_count_elem,node->node_node_id_ref_counts,nrcl_next){ + DPrintNodeId (node_id_ref_count_elem->nrcl_node_id,file); + printf (" %d ",node_id_ref_count_elem->nrcl_ref_count); + } + } + FPutS ("]\n",file); + print_spaces (n_leading_spaces+4,file); + +#if 0 +# ifndef PRINT_NODE_ID_REF_COUNTS + if (node->node_strict_node_ids!=NULL){ + StrictNodeIdP strict_node_id; + + FPutS ("let! ", file); + + for_l (strict_node_id,node->node_strict_node_ids,snid_next){ + if (strict_node_id->snid_mark & STRICT_NODE_ID_IDENT_MASK){ + FPrintF (file, " %s",strict_node_id->snid_ident->ident_name); + } else { + DPrintNodeId (strict_node_id->snid_node_id,file); + FPutS ("; ",file); + } + } + FPutC ('\n',file); + print_spaces (n_leading_spaces+4,file); + } +# endif +#endif + PrintArgument (node->node_arguments,False,n_leading_spaces+4,file); + + if (node->node_node_defs!=NULL){ + FPutC ('\n', file); + print_spaces (n_leading_spaces,file); + FPutS ("{\n",file); + PrintNodeDefs (node->node_node_defs,n_leading_spaces+4,file); + print_spaces (n_leading_spaces,file); + FPutS ("}\n", file); + print_spaces (n_leading_spaces,file); + } + break; + case PushNode: + { + NodeIdListElementP node_id_list; + + FPutS ("Push ",file); + DPrintNodeId (node->node_arguments->arg_node->node_node_id,file); + FPutS ("[",file); + for_l (node_id_list,node->node_node_ids,nidl_next){ + DPrintNodeId (node_id_list->nidl_node_id,file); + if (node_id_list->nidl_next!=NULL) + FPutC (' ',file); + } + FPutS ("]",file); + FPutC ('\n',file); + print_spaces (n_leading_spaces,file); + PrintArgument (node->node_arguments->arg_next,True,n_leading_spaces,file); + break; + } + case GuardNode: + FPutS ("Guard ",file); + PrintArguments (node->node_arguments,'\n',True,n_leading_spaces,file); + break; + case TupleSelectorsNode: + FPutS ("TupleSelectors (",file); + PrintArguments (node->node_arguments,',',True,n_leading_spaces,file); + FPutS (") = ",file); + PrintRuleNode (node->node_node,True,n_leading_spaces,file); + break; + case ScopeNode: + FPutS ("ScopeNode ",file); + PrintRuleNode (node->node_node,True,n_leading_spaces,file); + if (node->node_arguments!=NULL){ + FPutS (" ScopeNodeArguments ",file); + PrintArguments (node->node_arguments,' ',True,n_leading_spaces,file); + } + break; + case FillUniqueNode: + FPutS ("FillUniqueNode ",file); + DPrintNodeId (node->node_node->node_arguments->arg_node->node_node_id,file); + FPutC (' ',file); + PrintArguments (node->node_arguments,' ',True,n_leading_spaces,file); + break; + default: + FPutC ('?',file); + FPrintF (file,"%d",(int)node->node_kind); + } +} + +void PrintNodeDef (NodeDefP def_p,int n_leading_spaces,File file) +{ + int n; + + /* FPrintF (file, "%d: ", (int) def_p->def_number); */ + + for (n=n_leading_spaces; n>0; --n) + FPutC (' ',file); + +/* if (def_p->def_has_lhs_pattern) + PrintRuleNode (def_p->def_pattern,False,n_leading_spaces,file); + else +*/ + DPrintNodeId (def_p -> def_id, file); + + if (def_p -> def_node){ + FPutS (" = ", file); + PrintRuleNode (def_p->def_node, False,n_leading_spaces,file); + } + + FPutS ("\n",file); +} + +void PrintNodeDefs (NodeDefs defs,int n_leading_spaces,File file) +{ + for ( ; defs!=NULL; defs=defs->def_next) + PrintNodeDef (defs,n_leading_spaces,file); +} + +STRUCT (lifted_node_id,LiftedNodeId){ + NodeId lnid_lifted_node_id; + NodeId lnid_lhs_node_id; + struct lifted_node_id * lnid_next; +}; + +void PrintRuleAlt (RuleAlts rulealt,int n_leading_spaces,File file) +{ + PrintRuleNode (rulealt->alt_lhs_root, False,n_leading_spaces,file); + +#ifdef PRINT_alt_lifted_node_ids + if (rulealt->alt_lifted_node_ids){ + LiftedNodeId lifted_node_id_p; + + FPutS (" <<",file); + for_l (lifted_node_id_p,rulealt->alt_lifted_node_ids,lnid_next){ + FPutC (' ',file); + DPrintNodeId (lifted_node_id_p->lnid_lhs_node_id,file); + FPutC (':',file); + DPrintNodeId (lifted_node_id_p->lnid_lifted_node_id,file); + } + FPutS (" >>",file); + } +#endif + + if (rulealt->alt_lhs_defs){ + FPutS ("\n", file); + PrintNodeDefs (rulealt -> alt_lhs_defs,4,file); + FPutS (" = ", file); + } else + FPutS ("\n = ", file); + + if (rulealt -> alt_kind==Contractum){ +#if 1 +# ifndef PRINT_NODE_ID_REF_COUNTS + if (rulealt->alt_strict_node_ids!=NULL){ + StrictNodeIdP strict_node_id; + + FPutS ("let! ", file); + + for_l (strict_node_id,rulealt->alt_strict_node_ids,snid_next){ + if (strict_node_id->snid_mark & STRICT_NODE_ID_IDENT_MASK){ + FPrintF (file, " %s",strict_node_id->snid_ident->ident_name); + } else { + DPrintNodeId (strict_node_id->snid_node_id,file); + FPutS ("; ",file); + } + } + FPutC ('\n',file); + print_spaces (n_leading_spaces,file); + } +# endif +#endif + + + PrintRuleNode (rulealt->alt_rhs_root, False,n_leading_spaces,file); + FPutS ("\n", file); + PrintNodeDefs (rulealt->alt_rhs_defs,4,file); + } else { +/* + FPutS (rulealt->alt_rhs_root->node_node_id->nid_ident->ident_name,file); +*/ + } +} + +static void PrintRuleAlts (RuleAlts rulealt,int n_leading_spaces,File file) +{ + for (; rulealt; rulealt = rulealt -> alt_next) + PrintRuleAlt (rulealt,n_leading_spaces,file); +} + +static void PrintTypeArguments (TypeArgs args, char separator, File file) +{ + if (args){ + PrintTypeNode (args->type_arg_node, file); + + for (args = args->type_arg_next; args; args = args->type_arg_next){ + FPutC (separator, file); + PrintTypeNode (args->type_arg_node, file); + } + } +} + +static char *PrintUniVars = "uvwxyz"; +#define NrOfPrintUniVars 6 + +void PrintTypeNode (TypeNode node, File file) +{ + if (node->type_node_annotation || node->type_node_annotation == StrictOnA) + FPutC ('!', file); + + if (node->type_node_attribute == UniqueAttr) + FPutC ('*', file); + else if (node->type_node_attribute > UniqueAttr) + { unsigned node_attr = node->type_node_attribute - UniqueAttr; + + if (node_attr < NrOfPrintUniVars) + { FPutC (PrintUniVars[node_attr], file); + FPutC (':', file); + } + else + FPrintF (file, "%u:", node_attr); + } + + if (node->type_node_is_var) + FPutS (node->type_node_tv->tv_ident->ident_name, file); + else if (node->type_node_symbol->symb_kind == tuple_type) + { FPutC ('(', file); + PrintTypeArguments (node->type_node_arguments, ',', file); + FPutC (')', file); + } + else if (node->type_node_symbol->symb_kind == list_type) + { FPutC ('[', file); + PrintTypeArguments (node->type_node_arguments,',', file); + FPutC (']', file); + } + else if (node->type_node_symbol->symb_kind >= array_type && + node->type_node_symbol->symb_kind <= unboxed_array_type) + { char *delim_chars = ":|#"; + char array_delim = delim_chars [node->type_node_symbol->symb_kind - array_type]; + FPutC ('{', file); + FPutC (array_delim, file); + PrintTypeArguments (node->type_node_arguments,',', file); + FPutC (array_delim, file); + FPutC ('}', file); + } + else if (node->type_node_symbol->symb_kind == apply_symb) + { FPutC ('(', file); + PrintTypeArguments (node -> type_node_arguments, ' ', file); + FPutC (')', file); + } else + { if (node->type_node_arguments) + FPutC ('(', file); + + PrintSymbol (node->type_node_symbol, file); + + if (node->type_node_arguments){ + FPutC (' ', file); + + PrintTypeArguments (node->type_node_arguments,' ', file); + + FPutC (')', file); + } + } +} + +static void PrintAttribute (AttributeKind attr, File file) +{ + if (attr == NotUniqueAttr) + return; + else if (attr == UniqueAttr) + FPutC ('*', file); + else + FPrintF (file, "%d", attr - UniqueAttr, file); + +} + +static void PrintTypeAttrEquations (UniVarEquations equs, File file) +{ + for (; equs; equs = equs -> uve_next) + { AttributeKindList next; + PrintAttribute (equs -> uve_demanded, file); + FPutC (':', file); + for (next = equs -> uve_offered; next; next = next -> akl_next) + { FPutC (' ', file); + PrintAttribute (next -> akl_elem, file); + } + } +} + +static void PrintTypeContext (TypeContext type_context, File file) +{ + SymbolList symbols; + + for (symbols = type_context -> tyco_symbols; symbols; symbols = symbols -> sl_next) + { PrintSymbol (symbols -> sl_symbol -> sdef_class -> cd_symbol, file); + FPutC (' ', file); + DPrintTypeVar (type_context -> tyco_variable, NULL, file); + } +} + +static void PrintTypeContexts (TypeContext type_contexts, File file) +{ + PrintTypeContext (type_contexts, file); + + for (type_contexts = type_contexts -> tyco_next; type_contexts; type_contexts = type_contexts -> tyco_next) + { FPutS (" & ", file); + PrintTypeContext (type_contexts, file); + } +} + +void PrintTypeAlt (TypeAlts type_alts, File file, Bool with_equats) +{ + TypeNode lhs_root = type_alts -> type_alt_lhs; + + PrintSymbol (lhs_root -> type_node_symbol, file); + FPutS (" :: ", file); + PrintTypeArguments (lhs_root -> type_node_arguments, ' ', file); + + FPutS (" -> ", file); + PrintTypeNode (type_alts -> type_alt_rhs, file); + if (type_alts -> type_alt_type_context) + { FPutS (" | ", file); + PrintTypeContexts (type_alts -> type_alt_type_context, file); + } + FPutC ('\n', file); + if (with_equats) + { PrintTypeAttrEquations (type_alts -> type_alt_attr_equations, file); + FPutC ('\n', file); + } +} + +void PrintImpRule (ImpRules rule,int n_leading_spaces,File file) +{ + /* + if (rule -> rule_type) + PrintTypeAlt (rule -> rule_type, file); + */ + + PrintRuleAlts (rule->rule_alts,n_leading_spaces,file); +} + +void PrintRules (ImpRules rules) +{ + ImpRuleS *rule; + + for_l (rule,rules,rule_next){ + PrintImpRule (rule,4,StdOut); + + if (rule->rule_next!=NULL) + FPutC ('\n',StdOut); + } +} + +#ifdef _COMPSTATS_ + +unsigned long + NrNodeCells, + NrArgCells, + NrTypeNodeCells, + NrTypeArgCells, + NrExpandedTypeNodeCells, + NrExpandedTypeArgCells, + NrNodeIdCells, + NrSymbolCells, + NrBasicNodes; + +void InitDB (void) +{ + NrArgCells = NrNodeCells = NrNodeIdCells =0; + NrTypeArgCells = NrTypeNodeCells =0; + NrExpandedTypeNodeCells = NrExpandedTypeArgCells = 0; + NrBasicNodes = NrSymbolCells = 0; +} + +extern unsigned long NrOfBytes; +void PrintCompStats (void, File file) +{ + FPutC('\n', file); + FPrintF (file, "Number of nodes: %lu\n", NrNodeCells); + FPrintF (file, "Number of arguments: %lu\n", NrArgCells); + FPrintF (file, "Number of type nodes: %lu\n", NrTypeNodeCells); + FPrintF (file, "Number of type arguments: %lu\n", NrTypeArgCells); + FPrintF (file, "Number of expanded type nodes: %lu\n", NrExpandedTypeNodeCells); + FPrintF (file, "Number of expanded type arguments: %lu\n", NrExpandedTypeArgCells); + FPrintF (file, "Number of nodeids: %lu\n", NrNodeIdCells); + FPrintF (file, "Number of symbols: %lu\n", NrSymbolCells); + FPrintF (file, "Number of basic nodes: %lu\n", NrBasicNodes); + FPrintF (file, "Total number of bytes: %lu\n", NrOfBytes); +} + +#endif |