69 |
p = relts; |
p = relts; |
70 |
|
|
71 |
for (ruleno = 1; ruleno < nrules + 1; ++ruleno) |
for (ruleno = 1; ruleno < nrules + 1; ++ruleno) |
72 |
if (ritem[rule_table[ruleno].rhs] > 0) |
if (rule_table[ruleno].useful) |
73 |
{ |
{ |
74 |
/* This rule has a non empty RHS. */ |
if (ritem[rule_table[ruleno].rhs] > 0) |
75 |
short *r; |
{ |
76 |
int any_tokens = 0; |
/* This rule has a non empty RHS. */ |
77 |
for (r = ritem + rule_table[ruleno].rhs; *r > 0; ++r) |
short *r; |
78 |
if (ISTOKEN (*r)) |
int any_tokens = 0; |
79 |
any_tokens = 1; |
for (r = ritem + rule_table[ruleno].rhs; *r > 0; ++r) |
80 |
|
if (ISTOKEN (*r)) |
81 |
|
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 + rule_table[ruleno].rhs; *r > 0; ++r) |
for (r = ritem + rule_table[ruleno].rhs; *r > 0; ++r) |
87 |
{ |
{ |
88 |
rcount[ruleno]++; |
rcount[ruleno]++; |
89 |
p->next = rsets[*r]; |
p->next = rsets[*r]; |
90 |
p->value = ruleno; |
p->value = ruleno; |
91 |
rsets[*r] = p; |
rsets[*r] = p; |
92 |
p++; |
p++; |
93 |
} |
} |
94 |
} |
} |
95 |
else |
else |
|
{ |
|
|
/* This rule has an empty RHS. */ |
|
|
assert (ritem[rule_table[ruleno].rhs] == -ruleno); |
|
|
if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs]) |
|
96 |
{ |
{ |
97 |
nullable[rule_table[ruleno].lhs] = 1; |
/* This rule has an empty RHS. */ |
98 |
*s2++ = rule_table[ruleno].lhs; |
assert (ritem[rule_table[ruleno].rhs] == -ruleno); |
99 |
|
if (rule_table[ruleno].useful && !nullable[rule_table[ruleno].lhs]) |
100 |
|
{ |
101 |
|
nullable[rule_table[ruleno].lhs] = 1; |
102 |
|
*s2++ = rule_table[ruleno].lhs; |
103 |
|
} |
104 |
} |
} |
105 |
} |
} |
106 |
|
|