#define PrintAnnotation(annot) static void PrintUnaryState (StateKind kind, ObjectKind obj) { switch (kind) { case OnB: FPutS ("OnB ", StdError); break; case OnA: FPutS ("OnA ", StdError); break; case StrictOnA: FPutS ("StrictOnA ", StdError); break; case SemiStrict: FPutS ("SemiStrict ", StdError); break; case StrictRedirection: FPutS ("StrictRedirection ", StdError); break; case Parallel: FPutS ("Parallel ", StdError); break; case Undefined: FPutS ("Undefined ", StdError); break; case UnderEval: FPutS ("UnderEval ", StdError); break; } switch (obj){ case UnknownObj: FPutS ("???", StdError); break; case IntObj: FPutS ("Int ", StdError); break; case BoolObj: FPutS ("Bool ", StdError); break; case CharObj: FPutS ("Char ", StdError); break; case StringObj: FPutS ("String ", StdError); break; case RealObj: FPutS ("Real ", StdError); break; case FileObj: FPutS ("File ", StdError); break; case TupleObj: FPutS ("Tuple ", StdError); break; case ListObj: FPutS ("List ", StdError); break; case ProcIdObj: FPutS ("ProcId ", StdError); break; } } /* PrintUnaryState */ static void PrintState (State state) { return; if (ArityOfState (state) == 1) PrintUnaryState (KindOfState(state),ObjectOfState(state)); } /* PrintState */ static void PrintNode (Node node, Bool brackets); static void PrintNodeId (NodeId nid, Node follow) { if (nid) { if (nid -> nid_name) FPrintF (StdError, "%d.%s",nid->nid_refcount, nid -> nid_name -> Name); else FPrintF (StdError, "%d.sel%ld",nid->nid_refcount, (long) nid); if (follow) FPutC (':', StdError); } } /* PrintNodeId */ static void PrintArgument (Args arg, Bool brackets) { PrintState (arg -> arg_state); PrintNodeId (arg -> arg_id, arg -> arg_pattern); if (arg -> arg_pattern) PrintNode (arg -> arg_pattern, brackets); } /* PrintArgument */ static void PrintArguments (Args args, char separator, Bool brackets) { if (args) { PrintArgument (args, brackets); for (args = args -> arg_next; args; args = args -> arg_next) { FPutC (separator, StdError); PrintArgument (args, brackets); } } } /* PrintArguments */ static void PrintNodeDefs (NodeDefs defs, Bool brackets); static void PrintNode (Node node, Bool brackets) { if (IsOnACycle (node -> node_number)) FPutS ("", StdError); PrintState (node -> node_state); if (node -> node_kind == NormalNodeKind) { if (node->node_symbol -> symb_kind == tuple_denot) { FPutC ('(', StdError); PrintArguments (GetNodeArguments(node), ',', False); FPutC (')', StdError); } else if (node->node_symbol -> symb_kind == list_type) { FPutC ('[', StdError); PrintArguments (GetNodeArguments(node), ',', False); FPutC (']', StdError); } else { if (brackets && GetNodeArguments(node)) FPutC ('(', StdError); FPutS (ConvertSymbolToString (node->node_symbol), StdError); if (GetNodeArguments(node)) { FPutC (' ', StdError); PrintArguments (GetNodeArguments(node),' ', True); if (brackets) FPutC (')', StdError); } } } else { Args elsepart, thenpart, condpart = GetIfArguments(node); thenpart = condpart -> arg_next; elsepart = thenpart -> arg_next; if (brackets) FPutC ('(', StdError); FPutS ("IF ", StdError); PrintArgument (condpart, True); FPutC ('\n', StdError); FPutS ("THEN ", StdError); PrintArgument (thenpart, True); if (node->node_then_node_defs) { FPutS ("[", StdError); PrintNodeDefs (node->node_then_node_defs, False); FPutS ("]\nELSE ", StdError); } else FPutS ("\nELSE ", StdError); PrintArgument (elsepart, True); if (GetElseShared(node)) { FPutS ("[\n", StdError); PrintNodeDefs (GetElseShared(node), False); FPutS ("]\n", StdError); } if (brackets) FPutC (')', StdError); } } /* PrintNode */ static void PrintNodeDefs (NodeDefs defs, Bool brackets) { for ( ; defs; defs = defs -> def_next) { FPrintF (StdError, "%d: ", (int) defs->def_number); PrintNodeId (defs -> def_id, defs -> def_node); if (defs -> def_node) PrintNode (defs -> def_node, False); FPutS ("\n", StdError); } } /* PrintNodeDefs */ static void PrintRuleAlt (RuleAlts rulealt) { PrintNode (rulealt -> alt_lhs -> def_node, False); FPutS (" -> ", StdError); if (rulealt -> alt_kind == Contractum) PrintNodeDefs (rulealt -> alt_rhs.alt_rhs_graph, False); else FPutS (rulealt -> alt_rhs.alt_rhs_root -> redir_id -> nid_name -> Name, StdError); FPutS (";\n", StdError); } /* PrintRuleAlt */ static void PrintRule (Rule rule) { RuleAlts rulealt = rule -> rule_alts; for (; rulealt; rulealt = rulealt -> alt_next); PrintRuleAlt (rulealt); } /* PrintRule */