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"); |
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; |
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 |
{ |
{ |
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; |
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 |
|
|