* src/nullable.c (nullable_print): New.

(set_nullable): Call it when tracing.
Better locality of variables.
This commit is contained in:
Akim Demaille
2001-11-19 10:39:49 +00:00
parent d9ec2d0749
commit 6bb1878b51
2 changed files with 30 additions and 14 deletions

View File

@@ -1,3 +1,10 @@
2001-11-19 Akim Demaille <akim@epita.fr>
* src/nullable.c (nullable_print): New.
(set_nullable): Call it when tracing.
Better locality of variables.
2001-11-19 Akim Demaille <akim@epita.fr> 2001-11-19 Akim Demaille <akim@epita.fr>
* src/print.c (print_actions): Better locality of variables. * src/print.c (print_actions): Better locality of variables.

View File

@@ -25,28 +25,35 @@
#include "system.h" #include "system.h"
#include "getargs.h" #include "getargs.h"
#include "reader.h"
#include "types.h" #include "types.h"
#include "gram.h" #include "gram.h"
#include "nullable.h" #include "nullable.h"
char *nullable = NULL; char *nullable = NULL;
static void
nullable_print (FILE *out)
{
int i;
fputs ("NULLABLE\n", out);
for (i = ntokens; i < nsyms; i++)
fprintf (out, "\t%s: %s\n", tags[i], nullable[i] ? "yes" : "no");
fputs ("\n\n", out);
}
void void
set_nullable (void) set_nullable (void)
{ {
short *r; short *r;
short *s1; short *s1;
short *s2; short *s2;
int ruleno;
int symbol;
shorts *p; shorts *p;
short *squeue; short *squeue;
short *rcount; short *rcount;
shorts **rsets; shorts **rsets;
shorts *relts; shorts *relts;
char any_tokens;
short *r1;
if (trace_flag) if (trace_flag)
fprintf (stderr, "Entering set_nullable\n"); fprintf (stderr, "Entering set_nullable\n");
@@ -69,7 +76,7 @@ set_nullable (void)
{ {
if (*r < 0) if (*r < 0)
{ {
symbol = rule_table[-(*r++)].lhs; int symbol = rule_table[-(*r++)].lhs;
if (symbol >= 0 && !nullable[symbol]) if (symbol >= 0 && !nullable[symbol])
{ {
nullable[symbol] = 1; nullable[symbol] = 1;
@@ -78,17 +85,16 @@ set_nullable (void)
} }
else else
{ {
r1 = r; int any_tokens = 0;
any_tokens = 0; int symbol;
short *r1 = r;
for (symbol = *r++; symbol > 0; symbol = *r++) for (symbol = *r++; symbol > 0; symbol = *r++)
{ if (ISTOKEN (symbol))
if (ISTOKEN (symbol)) any_tokens = 1;
any_tokens = 1;
}
if (!any_tokens) if (!any_tokens)
{ {
ruleno = -symbol; int ruleno = -symbol;
r = r1; r = r1;
for (symbol = *r++; symbol > 0; symbol = *r++) for (symbol = *r++; symbol > 0; symbol = *r++)
{ {
@@ -107,11 +113,11 @@ set_nullable (void)
p = rsets[*s1++]; p = rsets[*s1++];
while (p) while (p)
{ {
ruleno = p->value; int ruleno = p->value;
p = p->next; p = p->next;
if (--rcount[ruleno] == 0) if (--rcount[ruleno] == 0)
{ {
symbol = rule_table[ruleno].lhs; int symbol = rule_table[ruleno].lhs;
if (symbol >= 0 && !nullable[symbol]) if (symbol >= 0 && !nullable[symbol])
{ {
nullable[symbol] = 1; nullable[symbol] = 1;
@@ -125,6 +131,9 @@ set_nullable (void)
XFREE (rcount); XFREE (rcount);
XFREE (rsets + ntokens); XFREE (rsets + ntokens);
XFREE (relts); XFREE (relts);
if (trace_flag)
nullable_print (stderr);
} }