X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/aa7815f5c6e8e07a85e47df9cd7b579468969efb..eeeb962b:/src/nullable.c diff --git a/src/nullable.c b/src/nullable.c index 7240132f..c207924d 100644 --- a/src/nullable.c +++ b/src/nullable.c @@ -1,5 +1,5 @@ /* Part of the bison parser generator, - Copyright 1984, 1989, 2000 Free Software Foundation, Inc. + Copyright 1984, 1989, 2000, 2001 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -24,33 +24,39 @@ do so. */ #include "system.h" +#include "getargs.h" +#include "reader.h" #include "types.h" #include "gram.h" -#include "xalloc.h" #include "nullable.h" 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 set_nullable (void) { short *r; short *s1; short *s2; - int ruleno; - int symbol; shorts *p; short *squeue; short *rcount; shorts **rsets; shorts *relts; - char any_tokens; - short *r1; -#ifdef TRACE - fprintf (stderr, _("Entering set_nullable")); -#endif + if (trace_flag) + fprintf (stderr, "Entering set_nullable\n"); nullable = XCALLOC (char, nvars) - ntokens; @@ -70,7 +76,7 @@ set_nullable (void) { if (*r < 0) { - symbol = rlhs[-(*r++)]; + int symbol = rule_table[-(*r++)].lhs; if (symbol >= 0 && !nullable[symbol]) { nullable[symbol] = 1; @@ -79,17 +85,16 @@ set_nullable (void) } else { - r1 = r; - any_tokens = 0; + int any_tokens = 0; + int symbol; + short *r1 = r; for (symbol = *r++; symbol > 0; symbol = *r++) - { - if (ISTOKEN (symbol)) - any_tokens = 1; - } + if (ISTOKEN (symbol)) + any_tokens = 1; if (!any_tokens) { - ruleno = -symbol; + int ruleno = -symbol; r = r1; for (symbol = *r++; symbol > 0; symbol = *r++) { @@ -108,11 +113,11 @@ set_nullable (void) p = rsets[*s1++]; while (p) { - ruleno = p->value; + int ruleno = p->value; p = p->next; if (--rcount[ruleno] == 0) { - symbol = rlhs[ruleno]; + int symbol = rule_table[ruleno].lhs; if (symbol >= 0 && !nullable[symbol]) { nullable[symbol] = 1; @@ -126,6 +131,9 @@ set_nullable (void) XFREE (rcount); XFREE (rsets + ntokens); XFREE (relts); + + if (trace_flag) + nullable_print (stderr); }