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 (ritem[rules[ruleno].rhs] >= 0) |
if (rules[ruleno].rhs[0] >= 0) |
75 |
{ |
{ |
76 |
/* This rule has a non empty RHS. */ |
/* This rule has a non empty RHS. */ |
77 |
short *r; |
short *r; |
78 |
int any_tokens = 0; |
int any_tokens = 0; |
79 |
for (r = &ritem[rules[ruleno].rhs]; *r >= 0; ++r) |
for (r = rules[ruleno].rhs; *r >= 0; ++r) |
80 |
if (ISTOKEN (*r)) |
if (ISTOKEN (*r)) |
81 |
any_tokens = 1; |
any_tokens = 1; |
82 |
|
|
83 |
/* This rule has only nonterminals: schedule it for the second |
/* This rule has only nonterminals: schedule it for the second |
84 |
pass. */ |
pass. */ |
85 |
if (!any_tokens) |
if (!any_tokens) |
86 |
for (r = &ritem[rules[ruleno].rhs]; *r >= 0; ++r) |
for (r = rules[ruleno].rhs; *r >= 0; ++r) |
87 |
{ |
{ |
88 |
rcount[ruleno]++; |
rcount[ruleno]++; |
89 |
p->next = rsets[*r]; |
p->next = rsets[*r]; |
95 |
else |
else |
96 |
{ |
{ |
97 |
/* This rule has an empty RHS. */ |
/* This rule has an empty RHS. */ |
98 |
assert (ritem[rules[ruleno].rhs] == -ruleno); |
assert (rules[ruleno].rhs[0] == -ruleno); |
99 |
if (rules[ruleno].useful && !nullable[rules[ruleno].lhs]) |
if (rules[ruleno].useful && !nullable[rules[ruleno].lhs]) |
100 |
{ |
{ |
101 |
nullable[rules[ruleno].lhs] = 1; |
nullable[rules[ruleno].lhs] = 1; |