add (untested) predict set computation
This commit is contained in:
parent
2943cfdfdd
commit
f00060b2bd
1 changed files with 15 additions and 1 deletions
|
|
@ -25,7 +25,21 @@ unsigned int h_ll_lookup(const HLLTable *table, unsigned int nonterminal, uint8_
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// XXX predict_set
|
/* Compute the predict set of production "A -> rhs". */
|
||||||
|
HHashSet *h_predict(HCFGrammar *g, const HCFChoice *A, const HCFSequence *rhs)
|
||||||
|
{
|
||||||
|
// predict(A -> rhs) = first(rhs) u follow(A) if "" can be derived from rhs
|
||||||
|
// predict(A -> rhs) = first(rhs) otherwise
|
||||||
|
HHashSet *first_rhs = h_first_sequence(g, rhs->items);
|
||||||
|
if(h_sequence_derives_epsilon(g, rhs->items)) {
|
||||||
|
HHashSet *ret = h_hashset_new(g->arena, h_eq_ptr, h_hash_ptr);
|
||||||
|
h_hashset_put_all(ret, first_rhs);
|
||||||
|
h_hashset_put_all(ret, h_follow(g, A));
|
||||||
|
return ret;
|
||||||
|
} else {
|
||||||
|
return first_rhs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int h_ll_compile(HAllocator* mm__, const HParser* parser, const void* params)
|
int h_ll_compile(HAllocator* mm__, const HParser* parser, const void* params)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue