hammer/src/desugar.c

27 lines
778 B
C
Raw Normal View History

2013-03-17 13:25:02 -07:00
#include "hammer.h"
#include "internal.h"
#include "backends/contextfree.h"
HCFChoice *h_desugar(HAllocator *mm__, HCFStack *stk__, const HParser *parser) {
HCFStack *nstk__ = stk__;
if(parser->desugared == NULL) {
if (nstk__ == NULL) {
nstk__ = h_cfstack_new(mm__);
}
if (nstk__->prealloc == NULL) {
nstk__->prealloc = h_new(HCFChoice, 1);
}
// we're going to do something naughty and cast away the const to memoize
2013-05-27 08:31:15 +02:00
assert(parser->vtable->desugar != NULL);
((HParser *)parser)->desugared = nstk__->prealloc;
parser->vtable->desugar(mm__, nstk__, parser->env);
if (stk__ == NULL) {
h_cfstack_free(mm__, nstk__);
}
} else if (stk__ != NULL) {
HCFS_APPEND(parser->desugared);
}
return parser->desugared;
}