lalr: print the 'reads' relation

* src/relation.h, src/relation.c (relation_print): Accept and use a
title.
Don't print empty rows.
Indent the output.
Adjust dependencies.
* src/lalr.c (initialize_goto_follows): Print 'reads' in traces.
This commit is contained in:
Akim Demaille
2019-02-26 06:55:07 +01:00
parent 5255b919ae
commit a415a78d71
4 changed files with 25 additions and 31 deletions

View File

@@ -196,10 +196,7 @@ ielr_compute_internal_follow_edges (bitset ritem_sees_lookahead_set,
relation_transpose (edgesp, ngotos); relation_transpose (edgesp, ngotos);
if (trace_flag & trace_ielr) if (trace_flag & trace_ielr)
{ relation_print ("internal_follow_edges", *edgesp, ngotos, NULL, stderr);
fprintf (stderr, "internal_follow_edges:\n");
relation_print (*edgesp, ngotos, NULL, stderr);
}
} }
/** /**
@@ -304,8 +301,7 @@ ielr_compute_always_follows (goto_number ***edgesp,
if (trace_flag & trace_ielr) if (trace_flag & trace_ielr)
{ {
fprintf (stderr, "always follow edges:\n"); relation_print ("always follow edges", *edgesp, ngotos, NULL, stderr);
relation_print (*edgesp, ngotos, NULL, stderr);
fprintf (stderr, "always_follows:\n"); fprintf (stderr, "always_follows:\n");
debug_bitsetv (*always_followsp); debug_bitsetv (*always_followsp);
} }

View File

@@ -68,7 +68,7 @@ static goto_number **includes;
static goto_list **lookback; static goto_list **lookback;
static void static void
goto_print (goto_number i, FILE* out) goto_print (goto_number i, FILE *out)
{ {
const state_number src = from_state[i]; const state_number src = from_state[i];
const state_number dst = to_state[i]; const state_number dst = to_state[i];
@@ -193,6 +193,8 @@ initialize_goto_follows (void)
} }
} }
if (trace_flag & trace_automaton)
relation_print ("reads", reads, ngotos, goto_print, stderr);
relation_digraph (reads, ngotos, goto_follows); relation_digraph (reads, ngotos, goto_follows);
for (goto_number i = 0; i < ngotos; ++i) for (goto_number i = 0; i < ngotos; ++i)
@@ -282,15 +284,12 @@ build_relations (void)
relation_transpose (&includes, ngotos); relation_transpose (&includes, ngotos);
if (trace_flag & trace_automaton) if (trace_flag & trace_automaton)
{ relation_print ("includes", includes, ngotos, goto_print, stderr);
fprintf (stderr, "includes:\n");
relation_print (includes, ngotos, goto_print, stderr);
}
} }
/* Print FOLLOWS for debugging. */ /* Print FOLLOWS for debugging. */
static void static void
follows_print (FILE* out) follows_print (FILE *out)
{ {
for (goto_number i = 0; i < ngotos; ++i) for (goto_number i = 0; i < ngotos; ++i)
{ {

View File

@@ -27,17 +27,21 @@
#include "relation.h" #include "relation.h"
void void
relation_print (relation r, relation_node size, relation_print (const char *title,
relation r, relation_node size,
relation_node_print print, FILE *out) relation_node_print print, FILE *out)
{ {
if (title)
fprintf (out, "%s:\n", title);
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
{ if (r[i])
if (print) {
print (i, out); fputs (" ", out);
else if (print)
fprintf (out, "%3lu", (unsigned long) i); print (i, out);
fputc (':', out); else
if (r[i]) fprintf (out, "%3lu", (unsigned long) i);
fputc (':', out);
for (relation_node j = 0; r[i][j] != END_NODE; ++j) for (relation_node j = 0; r[i][j] != END_NODE; ++j)
{ {
fputc (' ', out); fputc (' ', out);
@@ -46,8 +50,8 @@ relation_print (relation r, relation_node size,
else else
fprintf (out, "%3lu", (unsigned long) r[i][j]); fprintf (out, "%3lu", (unsigned long) r[i][j]);
} }
fputc ('\n', out); fputc ('\n', out);
} }
fputc ('\n', out); fputc ('\n', out);
} }
@@ -130,10 +134,7 @@ relation_transpose (relation *R_arg, relation_node size)
relation r = *R_arg; relation r = *R_arg;
if (trace_flag & trace_sets) if (trace_flag & trace_sets)
{ relation_print ("relation_transpose", r, size, NULL, stderr);
fputs ("relation_transpose: input\n", stderr);
relation_print (r, size, NULL, stderr);
}
/* Count. */ /* Count. */
/* NEDGES[I] -- total size of NEW_R[I]. */ /* NEDGES[I] -- total size of NEW_R[I]. */
@@ -175,10 +176,7 @@ relation_transpose (relation *R_arg, relation_node size)
free (r); free (r);
if (trace_flag & trace_sets) if (trace_flag & trace_sets)
{ relation_print ("relation_transpose: output", new_R, size, NULL, stderr);
fputs ("relation_transpose: output\n", stderr);
relation_print (new_R, size, NULL, stderr);
}
*R_arg = new_R; *R_arg = new_R;
} }

View File

@@ -36,7 +36,8 @@ typedef relation_nodes *relation;
typedef void (relation_node_print) (relation_node node, FILE* out); typedef void (relation_node_print) (relation_node node, FILE* out);
/* Report a relation R that has SIZE vertices. */ /* Report a relation R that has SIZE vertices. */
void relation_print (relation r, size_t size, void relation_print (const char *title,
relation r, size_t size,
relation_node_print print, FILE *out); relation_node_print print, FILE *out);
/* Compute the transitive closure of the FUNCTION on the relation R /* Compute the transitive closure of the FUNCTION on the relation R