mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
VCG updates
This commit is contained in:
19
ChangeLog
19
ChangeLog
@@ -1,3 +1,22 @@
|
||||
2001-08-08 Marc Autret <autret_m@epita.fr>
|
||||
|
||||
* src/vcg_default.h: Use NULL instead of 0 to initialize pointers.
|
||||
* src/vcg.c (output_node): Fix.
|
||||
* src/vcg.h: Cleanup.
|
||||
* src/print_graph.c: Add comments.
|
||||
(node_output_size): New global variable. Simplify the formatting of
|
||||
the VCG graph output.
|
||||
(print_actions): Unused code is now used. It notifies the final state
|
||||
and no action states in the VCG graph. It also give the reduce actions.
|
||||
The `shift and goto' edges are red and the `go to state' edges are
|
||||
blue.
|
||||
Get the current node name and node_obstack by argument.
|
||||
(node_obstack): New variable.
|
||||
(print_state): Manage node_obstack.
|
||||
(print_core): Use node_obstack given by argument.
|
||||
A node is not only computed here but in print_actions also.
|
||||
(print_graph): CPP out useless code instead of commenting it.
|
||||
|
||||
2001-08-07 Pascal Bart <pascal.bart@epita.fr>
|
||||
|
||||
* tests/atconfig.in (CPPFLAGS): Fix.
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
static graph_t graph;
|
||||
|
||||
static unsigned node_output_size = 0;
|
||||
|
||||
/* Return an unambiguous printable representated, allocated in slot 0,
|
||||
for NAME, suitable for C strings. */
|
||||
static char const *
|
||||
@@ -46,7 +48,7 @@ quote (char const *name)
|
||||
|
||||
/* This part will construct the label of nodes. */
|
||||
static void
|
||||
print_core (int state)
|
||||
print_core (int state, struct obstack *node_obstack)
|
||||
{
|
||||
int i;
|
||||
int k;
|
||||
@@ -61,12 +63,10 @@ print_core (int state)
|
||||
if (k == 0)
|
||||
return;
|
||||
|
||||
obstack_sgrow (&graph_obstack, "\t\tlabel:\t\"");
|
||||
|
||||
for (i = 0; i < k; i++)
|
||||
{
|
||||
if (i)
|
||||
obstack_sgrow (&graph_obstack, "\\n");
|
||||
obstack_sgrow (node_obstack, "\\n");
|
||||
|
||||
sp1 = sp = ritem + statep->items[i];
|
||||
|
||||
@@ -75,23 +75,23 @@ print_core (int state)
|
||||
|
||||
rule = -(*sp);
|
||||
|
||||
obstack_fgrow1 (&graph_obstack, "%d: ", rule);
|
||||
obstack_fgrow1 (&graph_obstack, " %s -> ", quote (tags[rlhs[rule]]));
|
||||
obstack_fgrow1 (node_obstack, "%d: ", rule);
|
||||
obstack_fgrow1 (node_obstack, " %s -> ", quote (tags[rlhs[rule]]));
|
||||
|
||||
for (sp = ritem + rrhs[rule]; sp < sp1; sp++)
|
||||
obstack_fgrow1 (&graph_obstack, "%s ", quote (tags[*sp]));
|
||||
obstack_fgrow1 (node_obstack, "%s ", quote (tags[*sp]));
|
||||
|
||||
obstack_1grow (&graph_obstack, '.');
|
||||
obstack_1grow (node_obstack, '.');
|
||||
|
||||
while (*sp > 0)
|
||||
obstack_fgrow1 (&graph_obstack, " %s", quote (tags[*sp++]));
|
||||
|
||||
obstack_fgrow1 (node_obstack, " %s", quote (tags[*sp++]));
|
||||
}
|
||||
obstack_sgrow (&graph_obstack, "\"\n");
|
||||
}
|
||||
|
||||
/* Output in graph_obstack edges specifications in incidence with current
|
||||
node. */
|
||||
static void
|
||||
print_actions (int state, node_t *node)
|
||||
print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
||||
{
|
||||
int i;
|
||||
int k;
|
||||
@@ -110,12 +110,10 @@ print_actions (int state, node_t *node)
|
||||
|
||||
if (!shiftp && !redp)
|
||||
{
|
||||
#if 0
|
||||
if (final_state == state)
|
||||
fprintf (f, " $default\taccept\n");
|
||||
obstack_sgrow (node_obstack, "$default: accept");
|
||||
else
|
||||
fprintf (f, " NO ACTIONS\n");
|
||||
#endif
|
||||
obstack_sgrow (node_obstack, "NO ACTIONS");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -139,10 +137,11 @@ print_actions (int state, node_t *node)
|
||||
if (state > state1)
|
||||
edge.type = back_edge;
|
||||
open_edge (&edge, &graph_obstack);
|
||||
edge.sourcename = node->title;
|
||||
/* The edge source is the current node. */
|
||||
edge.sourcename = node_name;
|
||||
sprintf (buff, "%d", state1);
|
||||
edge.targetname = buff;
|
||||
edge.color = (symbol == 0) ? blue : red;
|
||||
edge.color = (symbol == 0) ? red : blue;
|
||||
/* FIXME: Be aware that quote uses static memory. The string
|
||||
must be output immediately (which is the case here). */
|
||||
edge.label = tags[symbol] ? quote (tags[symbol]) : NULL;
|
||||
@@ -168,13 +167,25 @@ print_actions (int state, node_t *node)
|
||||
if (!errp->errs[j])
|
||||
continue;
|
||||
symbol = errp->errs[j];
|
||||
/* If something has been added in the NODE_OBSTACK after
|
||||
the declaration of the label, then we need a `\n'. */
|
||||
if (obstack_object_size (node_obstack) > node_output_size)
|
||||
obstack_sgrow (node_obstack, "\\n");
|
||||
obstack_fgrow1 (node_obstack, _("%-4s\terror (nonassociative)"),
|
||||
tags[symbol]);
|
||||
}
|
||||
if (j > 0)
|
||||
obstack_sgrow (node_obstack, "\\n");
|
||||
}
|
||||
|
||||
if (consistent[state] && redp)
|
||||
{
|
||||
rule = redp->rules[0];
|
||||
symbol = rlhs[rule];
|
||||
if (obstack_object_size (node_obstack) > node_output_size)
|
||||
obstack_sgrow (node_obstack, "\\n");
|
||||
obstack_fgrow2 (node_obstack, _("$default\treduce using rule %d (%s)"),
|
||||
rule, tags[symbol]);
|
||||
}
|
||||
|
||||
if (i < k)
|
||||
@@ -188,7 +199,7 @@ print_actions (int state, node_t *node)
|
||||
|
||||
new_edge (&edge);
|
||||
open_edge (&edge, &graph_obstack);
|
||||
edge.sourcename = node->title;
|
||||
edge.sourcename = node_name;
|
||||
sprintf (buff, "%d", state1);
|
||||
edge.targetname = buff;
|
||||
edge.color = red;
|
||||
@@ -199,24 +210,46 @@ print_actions (int state, node_t *node)
|
||||
}
|
||||
}
|
||||
|
||||
/* Output in GRAPH_OBSTACK the current node specifications and edges
|
||||
which go out from that node. */
|
||||
static void
|
||||
print_state (int state)
|
||||
{
|
||||
static char name[10];
|
||||
struct obstack node_obstack;
|
||||
node_t node;
|
||||
|
||||
new_node (&node);
|
||||
open_node (&graph_obstack);
|
||||
|
||||
obstack_init (&node_obstack);
|
||||
new_node (&node); /* Set node attributs default value. */
|
||||
sprintf (name, "%d", state);
|
||||
node.title = name;
|
||||
output_node (&node, &graph_obstack);
|
||||
|
||||
print_core (state); /* node label */
|
||||
|
||||
close_node (&graph_obstack);
|
||||
|
||||
print_actions (state, &node); /* edges */
|
||||
node.title = name; /* Give a name to the node. */
|
||||
open_node (&node_obstack);
|
||||
/* Output a VCG formatted attributs list. */
|
||||
output_node (&node, &node_obstack);
|
||||
|
||||
{
|
||||
/* Here we begin to compute the node label. */
|
||||
obstack_sgrow (&node_obstack, "\t\tlabel:\t\""); /* Open Label */
|
||||
|
||||
/* Keep the size of NODE_OBSTACK before computing the label. It is
|
||||
useful to format the label. */
|
||||
node_output_size = obstack_object_size (&node_obstack);
|
||||
|
||||
/* Compute the labels of nodes on the fly. */
|
||||
print_core (state, &node_obstack);
|
||||
/* Compute edges and additionnal parts of node label. */
|
||||
print_actions (state, node.title, &node_obstack);
|
||||
|
||||
obstack_sgrow (&node_obstack, "\"\n"); /* Close Label. */
|
||||
|
||||
close_node (&node_obstack);
|
||||
}
|
||||
|
||||
/* `obstack_cat' NODE_OBSTACK to GRAPH_OBSTACK. */
|
||||
obstack_grow (&graph_obstack,
|
||||
obstack_base (&node_obstack),
|
||||
obstack_object_size (&node_obstack));
|
||||
obstack_finish (&node_obstack);
|
||||
}
|
||||
|
||||
|
||||
@@ -229,8 +262,10 @@ print_graph (void)
|
||||
return;
|
||||
new_graph (&graph);
|
||||
|
||||
/* graph.smanhattan_edges = yes;
|
||||
graph.manhattan_edges = yes; */
|
||||
#if 0
|
||||
graph.smanhattan_edges = yes;
|
||||
graph.manhattan_edges = yes;
|
||||
#endif
|
||||
|
||||
graph.display_edge_labels = yes;
|
||||
graph.layoutalgorithm = 0;
|
||||
|
||||
@@ -545,7 +545,7 @@ output_node (node_t *node, struct obstack *os)
|
||||
if (node->shrink != N_SHRINK)
|
||||
obstack_fgrow1 (os, "\t\tshrink:\t%d\n", node->shrink);
|
||||
if (node->stretch != N_STRETCH)
|
||||
obstack_fgrow1 (os, "\t\tshrink:\t%d\n", node->shrink);
|
||||
obstack_fgrow1 (os, "\t\tstretch:\t%d\n", node->stretch);
|
||||
|
||||
if (node->folding != N_FOLDING)
|
||||
obstack_fgrow1 (os, "\t\tfolding:\t%d\n", node->folding);
|
||||
@@ -580,7 +580,8 @@ output_node (node_t *node, struct obstack *os)
|
||||
void
|
||||
output_edge (edge_t *edge, struct obstack *os)
|
||||
{
|
||||
|
||||
/* FIXME: SOURCENAME and TARGETNAME are mandatory
|
||||
so it has to be fatal not to give these informations. */
|
||||
if (edge->sourcename != E_SOURCENAME)
|
||||
obstack_fgrow1 (os, "\t\tsourcename:\t\"%s\"\n", edge->sourcename);
|
||||
if (edge->targetname != E_TARGETNAME)
|
||||
|
||||
@@ -439,10 +439,6 @@ struct edge_s
|
||||
*/
|
||||
typedef struct edge_s edge_t;
|
||||
|
||||
/***************************************************************.
|
||||
**
|
||||
****************************************************************/
|
||||
|
||||
/*--------------------------------------------------------.
|
||||
| Graph attributs list. Structure that describes a graph. |
|
||||
`--------------------------------------------------------*/
|
||||
|
||||
@@ -22,11 +22,11 @@
|
||||
# define VCG_DEFAULTS_H_
|
||||
|
||||
/* Graph defaults. */
|
||||
# define G_TITLE 0
|
||||
# define G_LABEL 0
|
||||
# define G_INFOS1 0
|
||||
# define G_INFOS2 0
|
||||
# define G_INFOS3 0
|
||||
# define G_TITLE NULL
|
||||
# define G_LABEL NULL
|
||||
# define G_INFOS1 NULL
|
||||
# define G_INFOS2 NULL
|
||||
# define G_INFOS3 NULL
|
||||
|
||||
# define G_COLOR white
|
||||
# define G_TEXTCOLOR black
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
# define G_HIDDEN -1 /* No default value. */
|
||||
|
||||
# define G_CLASSNAME 0 /* No class name association */
|
||||
# define G_CLASSNAME NULL /* No class name association */
|
||||
# define G_LAYOUTALGORITHM normal
|
||||
# define G_LAYOUT_DOWNFACTOR 1
|
||||
# define G_LAYOUT_UPFACTOR 1
|
||||
@@ -106,12 +106,12 @@
|
||||
# define G_RMAX 100
|
||||
# define G_SMAX 100
|
||||
|
||||
# define G_NODE_LIST 0
|
||||
# define G_EDGE_LIST 0
|
||||
# define G_NODE_LIST NULL
|
||||
# define G_EDGE_LIST NULL
|
||||
|
||||
/* Nodes defaults. */
|
||||
# define N_TITLE 0
|
||||
# define N_LABEL 0
|
||||
# define N_TITLE NULL
|
||||
# define N_LABEL NULL
|
||||
|
||||
# define N_LOCX -1 /* Default unspcified */
|
||||
# define N_LOCY -1 /* Default unspcified */
|
||||
@@ -135,18 +135,18 @@
|
||||
# define N_TEXTCOLOR black
|
||||
# define N_BORDERCOLOR N_TEXTCOLOR
|
||||
|
||||
# define N_INFOS1 0
|
||||
# define N_INFOS2 0
|
||||
# define N_INFOS3 0
|
||||
# define N_INFOS1 NULL
|
||||
# define N_INFOS2 NULL
|
||||
# define N_INFOS3 NULL
|
||||
|
||||
# define N_NEXT 0
|
||||
# define N_NEXT NULL
|
||||
|
||||
/* Edge defaults. */
|
||||
# define E_EDGE_TYPE normal_edge
|
||||
|
||||
# define E_SOURCENAME 0 /* Mandatory. */
|
||||
# define E_TARGETNAME 0 /* Mandatory. */
|
||||
# define E_LABEL 0
|
||||
# define E_SOURCENAME NULL /* Mandatory. */
|
||||
# define E_TARGETNAME NULL /* Mandatory. */
|
||||
# define E_LABEL NULL
|
||||
|
||||
# define E_LINESTYLE continuous
|
||||
# define E_THICKNESS 2
|
||||
@@ -170,6 +170,6 @@
|
||||
|
||||
# define E_HORIZONTAL_ORDER -1
|
||||
|
||||
# define E_NEXT 0
|
||||
# define E_NEXT NULL
|
||||
|
||||
#endif /* not VCG_DEFAULTS_H_ */
|
||||
|
||||
Reference in New Issue
Block a user