/[bison]/bison/src/nullable.c
ViewVC logotype

Diff of /bison/src/nullable.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.15 by akim, Mon Nov 19 10:38:12 2001 UTC revision 1.16 by akim, Mon Nov 19 10:39:49 2001 UTC
# Line 25  Line 25 
25    
26  #include "system.h"  #include "system.h"
27  #include "getargs.h"  #include "getargs.h"
28    #include "reader.h"
29  #include "types.h"  #include "types.h"
30  #include "gram.h"  #include "gram.h"
31  #include "nullable.h"  #include "nullable.h"
32    
33  char *nullable = NULL;  char *nullable = NULL;
34    
35    static void
36    nullable_print (FILE *out)
37    {
38      int i;
39      fputs ("NULLABLE\n", out);
40      for (i = ntokens; i < nsyms; i++)
41        fprintf (out, "\t%s: %s\n", tags[i], nullable[i] ? "yes" : "no");
42      fputs ("\n\n", out);
43    }
44    
45  void  void
46  set_nullable (void)  set_nullable (void)
47  {  {
48    short *r;    short *r;
49    short *s1;    short *s1;
50    short *s2;    short *s2;
   int ruleno;  
   int symbol;  
51    shorts *p;    shorts *p;
52    
53    short *squeue;    short *squeue;
54    short *rcount;    short *rcount;
55    shorts **rsets;    shorts **rsets;
56    shorts *relts;    shorts *relts;
   char any_tokens;  
   short *r1;  
57    
58    if (trace_flag)    if (trace_flag)
59      fprintf (stderr, "Entering set_nullable\n");      fprintf (stderr, "Entering set_nullable\n");
# Line 69  set_nullable (void) Line 76  set_nullable (void)
76      {      {
77        if (*r < 0)        if (*r < 0)
78          {          {
79            symbol = rule_table[-(*r++)].lhs;            int symbol = rule_table[-(*r++)].lhs;
80            if (symbol >= 0 && !nullable[symbol])            if (symbol >= 0 && !nullable[symbol])
81              {              {
82                nullable[symbol] = 1;                nullable[symbol] = 1;
# Line 78  set_nullable (void) Line 85  set_nullable (void)
85          }          }
86        else        else
87          {          {
88            r1 = r;            int any_tokens = 0;
89            any_tokens = 0;            int symbol;
90              short *r1 = r;
91            for (symbol = *r++; symbol > 0; symbol = *r++)            for (symbol = *r++; symbol > 0; symbol = *r++)
92              {              if (ISTOKEN (symbol))
93                if (ISTOKEN (symbol))                any_tokens = 1;
                 any_tokens = 1;  
             }  
94    
95            if (!any_tokens)            if (!any_tokens)
96              {              {
97                ruleno = -symbol;                int ruleno = -symbol;
98                r = r1;                r = r1;
99                for (symbol = *r++; symbol > 0; symbol = *r++)                for (symbol = *r++; symbol > 0; symbol = *r++)
100                  {                  {
# Line 107  set_nullable (void) Line 113  set_nullable (void)
113        p = rsets[*s1++];        p = rsets[*s1++];
114        while (p)        while (p)
115          {          {
116            ruleno = p->value;            int ruleno = p->value;
117            p = p->next;            p = p->next;
118            if (--rcount[ruleno] == 0)            if (--rcount[ruleno] == 0)
119              {              {
120                symbol = rule_table[ruleno].lhs;                int symbol = rule_table[ruleno].lhs;
121                if (symbol >= 0 && !nullable[symbol])                if (symbol >= 0 && !nullable[symbol])
122                  {                  {
123                    nullable[symbol] = 1;                    nullable[symbol] = 1;
# Line 125  set_nullable (void) Line 131  set_nullable (void)
131    XFREE (rcount);    XFREE (rcount);
132    XFREE (rsets + ntokens);    XFREE (rsets + ntokens);
133    XFREE (relts);    XFREE (relts);
134    
135      if (trace_flag)
136        nullable_print (stderr);
137  }  }
138    
139    

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.16

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26