mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 08:43:03 +00:00
* src/lalr.h (state_t): New.
(state_table): Be a state_t * instead of a core **. (accessing_symbol): Remove, part of state_t. * src/lalr.c: Adjust. (set_accessing_symbol): Merge into... (set_state_table): this. * src/print_graph.c, src/conflicts.c: Adjust.
This commit is contained in:
10
ChangeLog
10
ChangeLog
@@ -1,3 +1,13 @@
|
|||||||
|
2001-11-19 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
|
* src/lalr.h (state_t): New.
|
||||||
|
(state_table): Be a state_t * instead of a core **.
|
||||||
|
(accessing_symbol): Remove, part of state_t.
|
||||||
|
* src/lalr.c: Adjust.
|
||||||
|
(set_accessing_symbol): Merge into...
|
||||||
|
(set_state_table): this.
|
||||||
|
* src/print_graph.c, src/conflicts.c: Adjust.
|
||||||
|
|
||||||
2001-11-14 Akim Demaille <akim@epita.fr>
|
2001-11-14 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
* tests/calc.at, tests/output.at, tests/regression.at,
|
* tests/calc.at, tests/output.at, tests/regression.at,
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ flush_shift (int state, int token)
|
|||||||
for (i = 0; i < k; i++)
|
for (i = 0; i < k; i++)
|
||||||
{
|
{
|
||||||
if (shiftp->shifts[i]
|
if (shiftp->shifts[i]
|
||||||
&& token == accessing_symbol[shiftp->shifts[i]])
|
&& token == state_table[shiftp->shifts[i]].accessing_symbol)
|
||||||
(shiftp->shifts[i]) = 0;
|
(shiftp->shifts[i]) = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -203,7 +203,7 @@ set_conflicts (int state)
|
|||||||
k = shiftp->nshifts;
|
k = shiftp->nshifts;
|
||||||
for (i = 0; i < k; i++)
|
for (i = 0; i < k; i++)
|
||||||
{
|
{
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
symbol = state_table[shiftp->shifts[i]].accessing_symbol;
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
SETBIT (lookaheadset, symbol);
|
SETBIT (lookaheadset, symbol);
|
||||||
@@ -303,7 +303,7 @@ count_sr_conflicts (int state)
|
|||||||
{
|
{
|
||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
symbol = state_table[shiftp->shifts[i]].accessing_symbol;
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
SETBIT (shiftset, symbol);
|
SETBIT (shiftset, symbol);
|
||||||
@@ -541,7 +541,7 @@ print_reductions (FILE *out, int state)
|
|||||||
{
|
{
|
||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
symbol = state_table[shiftp->shifts[i]].accessing_symbol;
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
/* if this state has a shift for the error token,
|
/* if this state has a shift for the error token,
|
||||||
@@ -656,7 +656,7 @@ print_reductions (FILE *out, int state)
|
|||||||
{
|
{
|
||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
symbol = accessing_symbol[shiftp->shifts[i]];
|
symbol = state_table[shiftp->shifts[i]].accessing_symbol;
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
SETBIT (shiftset, symbol);
|
SETBIT (shiftset, symbol);
|
||||||
|
|||||||
58
src/lalr.c
58
src/lalr.c
@@ -32,13 +32,17 @@
|
|||||||
#include "nullable.h"
|
#include "nullable.h"
|
||||||
#include "derives.h"
|
#include "derives.h"
|
||||||
|
|
||||||
|
/* All the decorated states, indexed by the state number. Warning:
|
||||||
|
there is a state_TABLE in LR0.c, but it is different and static.
|
||||||
|
*/
|
||||||
|
state_t *state_table = NULL;
|
||||||
|
|
||||||
int tokensetsize;
|
int tokensetsize;
|
||||||
short *lookaheads;
|
short *lookaheads;
|
||||||
short *LAruleno;
|
short *LAruleno;
|
||||||
unsigned *LA;
|
unsigned *LA;
|
||||||
short *accessing_symbol;
|
|
||||||
char *consistent;
|
char *consistent;
|
||||||
core **state_table;
|
|
||||||
shifts **shift_table;
|
shifts **shift_table;
|
||||||
reductions **reduction_table;
|
reductions **reduction_table;
|
||||||
short *goto_map;
|
short *goto_map;
|
||||||
@@ -146,22 +150,13 @@ set_state_table (void)
|
|||||||
{
|
{
|
||||||
core *sp;
|
core *sp;
|
||||||
|
|
||||||
state_table = XCALLOC (core *, nstates);
|
state_table = XCALLOC (state_t, nstates);
|
||||||
|
|
||||||
for (sp = first_state; sp; sp = sp->next)
|
for (sp = first_state; sp; sp = sp->next)
|
||||||
state_table[sp->number] = sp;
|
{
|
||||||
}
|
state_table[sp->number].state = sp;
|
||||||
|
state_table[sp->number].accessing_symbol = sp->accessing_symbol;
|
||||||
|
}
|
||||||
static void
|
|
||||||
set_accessing_symbol (void)
|
|
||||||
{
|
|
||||||
core *sp;
|
|
||||||
|
|
||||||
accessing_symbol = XCALLOC (short, nstates);
|
|
||||||
|
|
||||||
for (sp = first_state; sp; sp = sp->next)
|
|
||||||
accessing_symbol[sp->number] = sp->accessing_symbol;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -238,21 +233,21 @@ initialize_LA (void)
|
|||||||
|
|
||||||
rp = reduction_table[i];
|
rp = reduction_table[i];
|
||||||
sp = shift_table[i];
|
sp = shift_table[i];
|
||||||
if (rp && (rp->nreds > 1
|
if (rp
|
||||||
|| (sp && !ISVAR (accessing_symbol[sp->shifts[0]]))))
|
&& (rp->nreds > 1
|
||||||
|
|| (sp && !ISVAR (state_table[sp->shifts[0]].accessing_symbol))))
|
||||||
count += rp->nreds;
|
count += rp->nreds;
|
||||||
else
|
else
|
||||||
consistent[i] = 1;
|
consistent[i] = 1;
|
||||||
|
|
||||||
if (sp)
|
if (sp)
|
||||||
for (k = 0; k < sp->nshifts; k++)
|
for (k = 0; k < sp->nshifts; k++)
|
||||||
{
|
if (state_table[sp->shifts[k]].accessing_symbol
|
||||||
if (accessing_symbol[sp->shifts[k]] == error_token_number)
|
== error_token_number)
|
||||||
{
|
{
|
||||||
consistent[i] = 0;
|
consistent[i] = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
lookaheads[nstates] = count;
|
lookaheads[nstates] = count;
|
||||||
@@ -302,7 +297,7 @@ set_goto_map (void)
|
|||||||
{
|
{
|
||||||
for (i = sp->nshifts - 1; i >= 0; i--)
|
for (i = sp->nshifts - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
symbol = accessing_symbol[sp->shifts[i]];
|
symbol = state_table[sp->shifts[i]].accessing_symbol;
|
||||||
|
|
||||||
if (ISTOKEN (symbol))
|
if (ISTOKEN (symbol))
|
||||||
break;
|
break;
|
||||||
@@ -337,7 +332,7 @@ set_goto_map (void)
|
|||||||
for (i = sp->nshifts - 1; i >= 0; i--)
|
for (i = sp->nshifts - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
state2 = sp->shifts[i];
|
state2 = sp->shifts[i];
|
||||||
symbol = accessing_symbol[state2];
|
symbol = state_table[state2].accessing_symbol;
|
||||||
|
|
||||||
if (ISTOKEN (symbol))
|
if (ISTOKEN (symbol))
|
||||||
break;
|
break;
|
||||||
@@ -421,7 +416,7 @@ initialize_F (void)
|
|||||||
|
|
||||||
for (j = 0; j < k; j++)
|
for (j = 0; j < k; j++)
|
||||||
{
|
{
|
||||||
symbol = accessing_symbol[sp->shifts[j]];
|
symbol = state_table[sp->shifts[j]].accessing_symbol;
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
SETBIT (rowp, symbol);
|
SETBIT (rowp, symbol);
|
||||||
@@ -429,7 +424,7 @@ initialize_F (void)
|
|||||||
|
|
||||||
for (; j < k; j++)
|
for (; j < k; j++)
|
||||||
{
|
{
|
||||||
symbol = accessing_symbol[sp->shifts[j]];
|
symbol = state_table[sp->shifts[j]].accessing_symbol;
|
||||||
if (nullable[symbol])
|
if (nullable[symbol])
|
||||||
edge[nedges++] = map_goto (stateno, symbol);
|
edge[nedges++] = map_goto (stateno, symbol);
|
||||||
}
|
}
|
||||||
@@ -574,7 +569,7 @@ build_relations (void)
|
|||||||
{
|
{
|
||||||
nedges = 0;
|
nedges = 0;
|
||||||
state1 = from_state[i];
|
state1 = from_state[i];
|
||||||
symbol1 = accessing_symbol[to_state[i]];
|
symbol1 = state_table[to_state[i]].accessing_symbol;
|
||||||
|
|
||||||
for (rulep = derives[symbol1]; *rulep > 0; rulep++)
|
for (rulep = derives[symbol1]; *rulep > 0; rulep++)
|
||||||
{
|
{
|
||||||
@@ -591,7 +586,7 @@ build_relations (void)
|
|||||||
for (j = 0; j < k; j++)
|
for (j = 0; j < k; j++)
|
||||||
{
|
{
|
||||||
stateno = sp->shifts[j];
|
stateno = sp->shifts[j];
|
||||||
if (accessing_symbol[stateno] == symbol2)
|
if (state_table[stateno].accessing_symbol == symbol2)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -709,7 +704,6 @@ lalr (void)
|
|||||||
tokensetsize = WORDSIZE (ntokens);
|
tokensetsize = WORDSIZE (ntokens);
|
||||||
|
|
||||||
set_state_table ();
|
set_state_table ();
|
||||||
set_accessing_symbol ();
|
|
||||||
set_shift_table ();
|
set_shift_table ();
|
||||||
set_reduction_table ();
|
set_reduction_table ();
|
||||||
set_maxrhs ();
|
set_maxrhs ();
|
||||||
|
|||||||
17
src/lalr.h
17
src/lalr.h
@@ -74,10 +74,23 @@ extern short *LAruleno;
|
|||||||
extern unsigned *LA;
|
extern unsigned *LA;
|
||||||
|
|
||||||
|
|
||||||
|
/* A structure decorating a state, with additional information. */
|
||||||
|
typedef struct state_s
|
||||||
|
{
|
||||||
|
/* A state. */
|
||||||
|
core *state;
|
||||||
|
|
||||||
|
/* Its accessing symbol. */
|
||||||
|
short accessing_symbol;
|
||||||
|
} state_t;
|
||||||
|
|
||||||
|
/* All the decorated states, indexed by the state number. Warning:
|
||||||
|
there is a state_TABLE in LR0.c, but it is different and static.
|
||||||
|
*/
|
||||||
|
extern state_t *state_table;
|
||||||
|
|
||||||
extern int tokensetsize;
|
extern int tokensetsize;
|
||||||
extern short *lookaheads;
|
extern short *lookaheads;
|
||||||
extern short *accessing_symbol;
|
|
||||||
extern core **state_table;
|
|
||||||
extern shifts **shift_table;
|
extern shifts **shift_table;
|
||||||
extern reductions **reduction_table;
|
extern reductions **reduction_table;
|
||||||
|
|
||||||
|
|||||||
13
src/output.c
13
src/output.c
@@ -200,7 +200,11 @@ output_gram (void)
|
|||||||
static void
|
static void
|
||||||
output_stos (void)
|
output_stos (void)
|
||||||
{
|
{
|
||||||
output_table_data (&output_obstack, accessing_symbol,
|
int i;
|
||||||
|
short *values = (short *) alloca (sizeof (short) * nstates);
|
||||||
|
for (i = 0; i < nstates; ++i)
|
||||||
|
values[i] = state_table[i].accessing_symbol;
|
||||||
|
output_table_data (&output_obstack, values,
|
||||||
0, 1, nstates);
|
0, 1, nstates);
|
||||||
muscle_insert ("stos", obstack_finish (&output_obstack));
|
muscle_insert ("stos", obstack_finish (&output_obstack));
|
||||||
}
|
}
|
||||||
@@ -389,7 +393,7 @@ action_row (int state)
|
|||||||
if (!shift_state)
|
if (!shift_state)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
symbol = accessing_symbol[shift_state];
|
symbol = state_table[shift_state].accessing_symbol;
|
||||||
|
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
@@ -931,7 +935,6 @@ output_actions (void)
|
|||||||
XFREE (lookaheads);
|
XFREE (lookaheads);
|
||||||
XFREE (LA);
|
XFREE (LA);
|
||||||
XFREE (LAruleno);
|
XFREE (LAruleno);
|
||||||
XFREE (accessing_symbol);
|
|
||||||
|
|
||||||
goto_actions ();
|
goto_actions ();
|
||||||
XFREE (goto_map + ntokens);
|
XFREE (goto_map + ntokens);
|
||||||
@@ -945,6 +948,7 @@ output_actions (void)
|
|||||||
output_table ();
|
output_table ();
|
||||||
|
|
||||||
output_check ();
|
output_check ();
|
||||||
|
XFREE (state_table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1030,9 +1034,6 @@ static void
|
|||||||
free_itemsets (void)
|
free_itemsets (void)
|
||||||
{
|
{
|
||||||
core *cp, *cptmp;
|
core *cp, *cptmp;
|
||||||
|
|
||||||
XFREE (state_table);
|
|
||||||
|
|
||||||
for (cp = first_state; cp; cp = cptmp)
|
for (cp = first_state; cp; cp = cptmp)
|
||||||
{
|
{
|
||||||
cptmp = cp->next;
|
cptmp = cp->next;
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ print_core (FILE *out, int state)
|
|||||||
short *sp;
|
short *sp;
|
||||||
short *sp1;
|
short *sp1;
|
||||||
|
|
||||||
statep = state_table[state];
|
statep = state_table[state].state;
|
||||||
k = statep->nitems;
|
k = statep->nitems;
|
||||||
|
|
||||||
if (k == 0)
|
if (k == 0)
|
||||||
@@ -124,7 +124,7 @@ print_actions (FILE *out, int state)
|
|||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
state1 = shiftp->shifts[i];
|
state1 = shiftp->shifts[i];
|
||||||
symbol = accessing_symbol[state1];
|
symbol = state_table[state1].accessing_symbol;
|
||||||
/* The following line used to be turned off. */
|
/* The following line used to be turned off. */
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
@@ -184,7 +184,7 @@ print_actions (FILE *out, int state)
|
|||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
state1 = shiftp->shifts[i];
|
state1 = shiftp->shifts[i];
|
||||||
symbol = accessing_symbol[state1];
|
symbol = state_table[state1].accessing_symbol;
|
||||||
fprintf (out, _(" %-4s\tgo to state %d\n"),
|
fprintf (out, _(" %-4s\tgo to state %d\n"),
|
||||||
tags[symbol], state1);
|
tags[symbol], state1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ print_core (int state, struct obstack *node_obstack)
|
|||||||
short *sp;
|
short *sp;
|
||||||
short *sp1;
|
short *sp1;
|
||||||
|
|
||||||
statep = state_table[state];
|
statep = state_table[state].state;
|
||||||
k = statep->nitems;
|
k = statep->nitems;
|
||||||
|
|
||||||
if (k == 0)
|
if (k == 0)
|
||||||
@@ -88,7 +88,7 @@ print_core (int state, struct obstack *node_obstack)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output in graph_obstack edges specifications in incidence with current
|
/* Output in graph_obstack edges specifications in incidence with current
|
||||||
node. */
|
node. */
|
||||||
static void
|
static void
|
||||||
print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
||||||
@@ -126,7 +126,7 @@ print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
|||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
state1 = shiftp->shifts[i];
|
state1 = shiftp->shifts[i];
|
||||||
symbol = accessing_symbol[state1];
|
symbol = state_table[state1].accessing_symbol;
|
||||||
|
|
||||||
if (ISVAR (symbol))
|
if (ISVAR (symbol))
|
||||||
break;
|
break;
|
||||||
@@ -195,7 +195,7 @@ print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
|||||||
if (!shiftp->shifts[i])
|
if (!shiftp->shifts[i])
|
||||||
continue;
|
continue;
|
||||||
state1 = shiftp->shifts[i];
|
state1 = shiftp->shifts[i];
|
||||||
symbol = accessing_symbol[state1];
|
symbol = state_table[state1].accessing_symbol;
|
||||||
|
|
||||||
new_edge (&edge);
|
new_edge (&edge);
|
||||||
open_edge (&edge, fgraph);
|
open_edge (&edge, fgraph);
|
||||||
@@ -210,7 +210,7 @@ print_actions (int state, const char *node_name, struct obstack *node_obstack)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output in GRAPH_OBSTACK the current node specifications and edges
|
/* Output in GRAPH_OBSTACK the current node specifications and edges
|
||||||
which go out from that node. */
|
which go out from that node. */
|
||||||
static void
|
static void
|
||||||
print_state (int state)
|
print_state (int state)
|
||||||
@@ -223,28 +223,28 @@ print_state (int state)
|
|||||||
new_node (&node); /* Set node attributs default value. */
|
new_node (&node); /* Set node attributs default value. */
|
||||||
sprintf (name, "%d", state);
|
sprintf (name, "%d", state);
|
||||||
node.title = name; /* Give a name to the node. */
|
node.title = name; /* Give a name to the node. */
|
||||||
|
|
||||||
{
|
{
|
||||||
/* Here we begin to compute the node label. */
|
/* Here we begin to compute the node label. */
|
||||||
obstack_sgrow (&node_obstack, "\t\tlabel:\t\""); /* Open Label */
|
obstack_sgrow (&node_obstack, "\t\tlabel:\t\""); /* Open Label */
|
||||||
|
|
||||||
/* Keep the size of NODE_OBSTACK before computing the label. It is
|
/* Keep the size of NODE_OBSTACK before computing the label. It is
|
||||||
useful to format the label. */
|
useful to format the label. */
|
||||||
node_output_size = obstack_object_size (&node_obstack);
|
node_output_size = obstack_object_size (&node_obstack);
|
||||||
|
|
||||||
/* Compute the labels of nodes on the fly. */
|
/* Compute the labels of nodes on the fly. */
|
||||||
print_core (state, &node_obstack);
|
print_core (state, &node_obstack);
|
||||||
/* Compute edges and additionnal parts of node label. */
|
/* Compute edges and additionnal parts of node label. */
|
||||||
print_actions (state, node.title, &node_obstack);
|
print_actions (state, node.title, &node_obstack);
|
||||||
|
|
||||||
obstack_sgrow (&node_obstack, "\"\n"); /* Close Label. */
|
obstack_sgrow (&node_obstack, "\"\n"); /* Close Label. */
|
||||||
}
|
}
|
||||||
|
|
||||||
open_node (fgraph);
|
open_node (fgraph);
|
||||||
/* Output a VCG formatted attributs list. */
|
/* Output a VCG formatted attributs list. */
|
||||||
output_node (&node, fgraph);
|
output_node (&node, fgraph);
|
||||||
/* Save the node label. */
|
/* Save the node label. */
|
||||||
fwrite (obstack_base (&node_obstack),
|
fwrite (obstack_base (&node_obstack),
|
||||||
obstack_object_size (&node_obstack), 1, fgraph);
|
obstack_object_size (&node_obstack), 1, fgraph);
|
||||||
close_node (fgraph);
|
close_node (fgraph);
|
||||||
|
|
||||||
@@ -256,7 +256,7 @@ void
|
|||||||
print_graph (void)
|
print_graph (void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!graph_flag)
|
if (!graph_flag)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -267,7 +267,7 @@ print_graph (void)
|
|||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
graph.smanhattan_edges = yes;
|
graph.smanhattan_edges = yes;
|
||||||
graph.manhattan_edges = yes;
|
graph.manhattan_edges = yes;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
graph.display_edge_labels = yes;
|
graph.display_edge_labels = yes;
|
||||||
|
|||||||
Reference in New Issue
Block a user