46 |
void |
void |
47 |
set_nullable (void) |
set_nullable (void) |
48 |
{ |
{ |
49 |
int ruleno; |
rule_number_t ruleno; |
50 |
symbol_number_t *s1; |
symbol_number_t *s1; |
51 |
symbol_number_t *s2; |
symbol_number_t *s2; |
52 |
shorts *p; |
shorts *p; |
71 |
for (ruleno = 1; ruleno < nrules + 1; ++ruleno) |
for (ruleno = 1; ruleno < nrules + 1; ++ruleno) |
72 |
if (rules[ruleno].useful) |
if (rules[ruleno].useful) |
73 |
{ |
{ |
74 |
if (rules[ruleno].rhs[0] >= 0) |
rule_t *rule = &rules[ruleno]; |
75 |
|
if (rule->rhs[0] >= 0) |
76 |
{ |
{ |
77 |
/* This rule has a non empty RHS. */ |
/* This rule has a non empty RHS. */ |
78 |
item_number_t *r; |
item_number_t *r = NULL; |
79 |
int any_tokens = 0; |
int any_tokens = 0; |
80 |
for (r = rules[ruleno].rhs; *r >= 0; ++r) |
for (r = rule->rhs; *r >= 0; ++r) |
81 |
if (ISTOKEN (*r)) |
if (ISTOKEN (*r)) |
82 |
any_tokens = 1; |
any_tokens = 1; |
83 |
|
|
84 |
/* This rule has only nonterminals: schedule it for the second |
/* This rule has only nonterminals: schedule it for the second |
85 |
pass. */ |
pass. */ |
86 |
if (!any_tokens) |
if (!any_tokens) |
87 |
for (r = rules[ruleno].rhs; *r >= 0; ++r) |
for (r = rule->rhs; *r >= 0; ++r) |
88 |
{ |
{ |
89 |
rcount[ruleno]++; |
rcount[ruleno]++; |
90 |
p->next = rsets[*r]; |
p->next = rsets[*r]; |
96 |
else |
else |
97 |
{ |
{ |
98 |
/* This rule has an empty RHS. */ |
/* This rule has an empty RHS. */ |
99 |
assert (rules[ruleno].rhs[0] == -ruleno); |
assert (rule_number_of_item_number (rule->rhs[0]) == ruleno); |
100 |
if (rules[ruleno].useful && !nullable[rules[ruleno].lhs->number]) |
if (rule->useful && !nullable[rule->lhs->number]) |
101 |
{ |
{ |
102 |
nullable[rules[ruleno].lhs->number] = 1; |
nullable[rule->lhs->number] = 1; |
103 |
*s2++ = rules[ruleno].lhs->number; |
*s2++ = rule->lhs->number; |
104 |
} |
} |
105 |
} |
} |
106 |
} |
} |