extern short *itemsetend
;
extern unsigned *ruleset
;
reductions
*first_reduction
;
static shifts
*last_shift
;
static reductions
*last_reduction
;
static short *shift_symbol
;
static short **kernel_base
;
static short **kernel_end
;
static short *kernel_items
;
register short *item_end
;
register short *symbol_count
;
symbol_count
= NEW2(nsyms
, short);
item_end
= ritem
+ nitems
;
for (itemp
= ritem
; itemp
< item_end
; itemp
++)
kernel_base
= NEW2(nsyms
, short *);
kernel_items
= NEW2(count
, short);
for (i
= 0; i
< nsyms
; i
++)
kernel_base
[i
] = kernel_items
+ count
;
count
+= symbol_count
[i
];
if (max
< symbol_count
[i
])
shift_symbol
= symbol_count
;
kernel_end
= NEW2(nsyms
, short *);
shiftset
= NEW2(nsyms
, short);
redset
= NEW2(nrules
+ 1, short);
state_set
= NEW2(nitems
, core
*);
fprintf(stderr
, "Entering append_states()\n");
for (i
= 1; i
< nshifts
; i
++)
symbol
= shift_symbol
[i
];
while (j
> 0 && shift_symbol
[j
- 1] > symbol
)
shift_symbol
[j
] = shift_symbol
[j
- 1];
shift_symbol
[j
] = symbol
;
for (i
= 0; i
< nshifts
; i
++)
symbol
= shift_symbol
[i
];
shiftset
[i
] = get_state(symbol
);
itemset
= NEW2(nitems
, short);
ruleset
= NEW2(WORDSIZE(nrules
), unsigned);
closure(this_state
->items
, this_state
->nitems
);
this_state
= this_state
->next
;
fprintf(stderr
, "Entering get_state(%d)\n", symbol
);
isp1
= kernel_base
[symbol
];
iend
= kernel_end
[symbol
];
assert(0 <= key
&& key
< nitems
);
isp1
= kernel_base
[symbol
];
while (found
&& isp1
< iend
)
sp
= sp
->link
= new_state(symbol
);
state_set
[key
] = sp
= new_state(symbol
);
register short *start_derives
;
start_derives
= derives
[start_symbol
];
for (i
= 0; start_derives
[i
] >= 0; ++i
)
p
= (core
*) MALLOC(sizeof(core
) + i
*sizeof(short));
for (i
= 0; start_derives
[i
] >= 0; ++i
)
p
->items
[i
] = rrhs
[start_derives
[i
]];
first_state
= last_state
= this_state
= p
;
for (i
= 0; i
< nsyms
; i
++)
ksp
= kernel_end
[symbol
];
shift_symbol
[shiftcount
++] = symbol
;
ksp
= kernel_base
[symbol
];
kernel_end
[symbol
] = ksp
;
fprintf(stderr
, "Entering new_state(%d)\n", symbol
);
fatal("too many states");
isp1
= kernel_base
[symbol
];
iend
= kernel_end
[symbol
];
p
= (core
*) allocate((unsigned) (sizeof(core
) + (n
- 1) * sizeof(short)));
p
->accessing_symbol
= symbol
;
/* show_cores is used for debugging */
for (p
= first_state
; p
; ++k
, p
= p
->next
)
printf("state %d, number = %d, accessing symbol = %s\n",
k
, p
->number
, symbol_name
[p
->accessing_symbol
]);
while (ritem
[j
] >= 0) ++j
;
printf("%s :", symbol_name
[rlhs
[-ritem
[j
]]]);
printf(" %s", symbol_name
[ritem
[j
++]]);
printf(" %s", symbol_name
[ritem
[j
++]]);
/* show_ritems is used for debugging */
for (i
= 0; i
< nitems
; ++i
)
printf("ritem[%d] = %d\n", i
, ritem
[i
]);
/* show_rrhs is used for debugging */
for (i
= 0; i
< nrules
; ++i
)
printf("rrhs[%d] = %d\n", i
, rrhs
[i
]);
/* show_shifts is used for debugging */
for (p
= first_shift
; p
; ++k
, p
= p
->next
)
printf("shift %d, number = %d, nshifts = %d\n", k
, p
->number
,
printf("\t%d\n", p
->shift
[i
]);
p
= (shifts
*) allocate((unsigned) (sizeof(shifts
) +
(nshifts
- 1) * sizeof(short)));
p
->number
= this_state
->number
;
send
= shiftset
+ nshifts
;
for (isp
= itemset
; isp
< itemsetend
; isp
++)
p
= (reductions
*) allocate((unsigned) (sizeof(reductions
) +
(count
- 1) * sizeof(short)));
p
->number
= this_state
->number
;
last_reduction
->next
= p
;
derives
= NEW2(nsyms
, short *);
rules
= NEW2(nvars
+ nrules
, short);
for (lhs
= start_symbol
; lhs
< nsyms
; lhs
++)
derives
[lhs
] = rules
+ k
;
for (i
= 0; i
< nrules
; i
++)
FREE(derives
[start_symbol
]);
for (i
= start_symbol
; i
< nsyms
; i
++)
printf("%s derives ", symbol_name
[i
]);
for (sp
= derives
[i
]; *sp
>= 0; sp
++)
nullable
= MALLOC(nsyms
);
if (nullable
== 0) no_space();
for (i
= 0; i
< nsyms
; ++i
)
for (i
= 1; i
< nitems
; i
++)
while ((j
= ritem
[i
]) >= 0)
for (i
= 0; i
< nsyms
; i
++)
printf("%s is nullable\n", symbol_name
[i
]);
printf("%s is not nullable\n", symbol_name
[i
]);