This is rxdbug.c in view mode; [Download] [Up]
/* Copyright (C) 1995, 1996 Tom Lord
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program 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 Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this software; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include "rxall.h"
#include "rxgnucomp.h"
#include "rxnfa.h"
#ifdef HAVE_POSITIONAL_ARRAY_INITS
#define AT(X) [X] =
#else
#define AT(X)
#endif
char *node_type_names[] =
{
AT(r_cset) "r_cset",
AT(r_concat) "r_concat",
AT(r_alternate) "r_alternate",
AT(r_opt) "r_opt",
AT(r_star) "r_star",
AT(r_plus) "r_plus",
AT(r_string) "r_string",
AT(r_cut) "r_cut",
AT(r_interval) "r_interval",
AT(r_parens) "r_parens",
AT(r_context) "r_context"
};
void
print_cset (cset_size, cs)
int cset_size;
rx_Bitset cs;
{
int x;
if (!cs)
printf ("nil");
else
{
putchar ('[');
for (x = 0; x < cset_size; ++x)
if (RX_bitset_member (cs, x))
{
if (isprint(x))
putchar (x);
else
printf ("\\0%o ", x);
}
putchar (']');
}
}
void
print_string(struct rx_string *s, char bracket)
{
int x;
if (!s && bracket)
printf ("nil");
else
{
if (bracket)
putchar ('\"');
for (x = 0; x < s->len; ++x)
if (isprint(s->contents[x]))
putchar (s->contents[x]);
else
printf ("\\0%o ", x);
if (bracket)
putchar ('\"');
}
}
void
spaces (n)
int n;
{
while (n--)
putchar (' ');
}
void
print_rexp (cset_size, indent, rexp)
int cset_size;
int indent;
struct rexp_node * rexp;
{
spaces (indent);
if (!rexp)
printf ("nil\n");
else
{
printf ("Node %d type %d (%s), iv=%d(%c), iv2=%d, len=%d obs=%d cs=",
rexp->id, rexp->type, node_type_names[rexp->type],
rexp->params.intval,
(isprint (rexp->params.intval)
? rexp->params.intval
: ' '),
rexp->params.intval2,
rexp->len,
rexp->observed);
print_cset (cset_size, rexp->params.cset);
printf (" s=");
print_string (&(rexp->params.cstr), 1);
putchar ('\n');
if (rexp->params.pair.left || rexp->params.pair.right)
{
print_rexp (cset_size, indent + 2, rexp->params.pair.left);
print_rexp (cset_size, indent + 2, rexp->params.pair.right);
}
}
}
void
unparse_print_rexp (cset_size, rexp)
int cset_size;
struct rexp_node * rexp;
{
if (!rexp)
return;
else
switch (rexp->type)
{
case r_cset:
if (1 != rx_bitset_population (cset_size, rexp->params.cset))
print_cset (cset_size, rexp->params.cset);
else
{
int x;
rx_Bitset cs;
cs = rexp->params.cset;
for (x = 0; x < cset_size; ++x)
if (RX_bitset_member (cs, x))
{
if (isprint(x))
putchar (x);
else
printf ("\\0%o ", x);
}
}
break;
case r_string:
print_string (&(rexp->params.cstr), 0);
break;
case r_parens:
putchar ('(');
unparse_print_rexp (cset_size, rexp->params.pair.left);
putchar (')');
break;
case r_context:
putchar ('\\');
putchar (rexp->params.intval);
break;
case r_cut:
printf ("[[:cut %d:]]", rexp->params.intval);
break;
case r_concat:
unparse_print_rexp (cset_size, rexp->params.pair.left);
unparse_print_rexp (cset_size, rexp->params.pair.right);
break;
case r_alternate:
unparse_print_rexp (cset_size, rexp->params.pair.left);
putchar ('|');
unparse_print_rexp (cset_size, rexp->params.pair.right);
break;
case r_opt:
unparse_print_rexp (cset_size, rexp->params.pair.left);
putchar ('?');
break;
case r_star:
unparse_print_rexp (cset_size, rexp->params.pair.left);
putchar ('*');
break;
case r_plus:
unparse_print_rexp (cset_size, rexp->params.pair.left);
putchar ('+');
break;
case r_interval:
unparse_print_rexp (cset_size, rexp->params.pair.left);
printf ("{%d,%d}", rexp->params.intval, rexp->params.intval2);
break;
}
}
void
print_nfa_state (rx, state)
struct rx * rx;
struct rx_nfa_state * state;
{
struct rx_nfa_edge * e;
printf ("state %d, is_final %d, is_start %d\n",
state->id, state->is_final, state->is_start);
for (e = state->edges; e; e = e->next)
{
printf ("\tEdge %s to %d ",
(e->type == ne_cset
? "cset"
: (e->type == ne_epsilon
? "epsilon"
: "side effect")),
e->dest->id);
if (e->type == ne_cset)
print_cset (rx->local_cset_size, e->params.cset);
else
printf ("%d", (int)e->params.side_effect);
putchar ('\n');
}
}
void
print_nfa (rx)
struct rx * rx;
{
struct rx_nfa_state * state;
for (state = rx->nfa_states; state; state = state->next)
print_nfa_state (rx, state);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.