split out h_lrengine_action()

This commit is contained in:
Sven M. Hallberg 2013-06-19 14:09:39 +02:00
parent 129d50c0ef
commit 409d33c916
2 changed files with 21 additions and 9 deletions

View file

@ -190,18 +190,12 @@ HLREngine *h_lrengine_new(HArena *arena, HArena *tarena, const HLRTable *table)
return engine; return engine;
} }
void h_lrengine_step(HLREngine *engine, HInputStream *stream) const HLRAction *h_lrengine_action(HLREngine *engine, HInputStream *stream)
{ {
// short-hand names
HSlist *left = engine->left;
HSlist *right = engine->right; HSlist *right = engine->right;
HArena *arena = engine->arena; HArena *arena = engine->arena;
HArena *tarena = engine->tarena; HArena *tarena = engine->tarena;
// stack layout:
// on the left stack, we put pairs: (saved state, semantic value)
// on the right stack, we put pairs: (symbol, semantic value)
// make sure there is input on the right stack // make sure there is input on the right stack
if(h_slist_empty(right)) { if(h_slist_empty(right)) {
// XXX use statically-allocated terminal symbols // XXX use statically-allocated terminal symbols
@ -230,6 +224,18 @@ void h_lrengine_step(HLREngine *engine, HInputStream *stream)
// table lookup // table lookup
const HLRAction *action = h_lr_lookup(engine->table, engine->state, symbol); const HLRAction *action = h_lr_lookup(engine->table, engine->state, symbol);
return action;
}
void h_lrengine_step(HLREngine *engine, const HLRAction *action)
{
// short-hand names
HSlist *left = engine->left;
HSlist *right = engine->right;
HArena *arena = engine->arena;
HArena *tarena = engine->tarena;
if(action == NULL) { if(action == NULL) {
// no handle recognizable in input, terminate // no handle recognizable in input, terminate
engine->running = false; engine->running = false;
@ -313,7 +319,7 @@ HParseResult *h_lr_parse(HAllocator* mm__, const HParser* parser, HInputStream*
// run while the recognizer finds handles in the input // run while the recognizer finds handles in the input
while(engine->running) while(engine->running)
h_lrengine_step(engine, stream); h_lrengine_step(engine, h_lrengine_action(engine, stream));
HParseResult *result = h_lrengine_result(engine); HParseResult *result = h_lrengine_result(engine);
if(!result) if(!result)

View file

@ -61,8 +61,13 @@ typedef struct HLREnhGrammar_ {
typedef struct HLREngine_ { typedef struct HLREngine_ {
const HLRTable *table; const HLRTable *table;
// stack layout:
// on the left stack, we put pairs: (saved state, semantic value)
// on the right stack, we put pairs: (symbol, semantic value)
HSlist *left; // left stack; reductions happen here HSlist *left; // left stack; reductions happen here
HSlist *right; // right stack; input appears here HSlist *right; // right stack; input appears here
size_t state; size_t state;
bool running; bool running;
HArena *arena; // will hold the results HArena *arena; // will hold the results
@ -116,7 +121,8 @@ int h_lalr_compile(HAllocator* mm__, HParser* parser, const void* params);
void h_lalr_free(HParser *parser); void h_lalr_free(HParser *parser);
const HLRAction *h_lr_lookup(const HLRTable *table, size_t state, const HCFChoice *symbol); const HLRAction *h_lr_lookup(const HLRTable *table, size_t state, const HCFChoice *symbol);
void h_lrengine_step(HLREngine *engine, HInputStream *stream); const HLRAction *h_lrengine_action(HLREngine *engine, HInputStream *stream);
void h_lrengine_step(HLREngine *engine, const HLRAction *action);
HParseResult *h_lrengine_result(HLREngine *engine); HParseResult *h_lrengine_result(HLREngine *engine);
HParseResult *h_lr_parse(HAllocator* mm__, const HParser* parser, HInputStream* stream); HParseResult *h_lr_parse(HAllocator* mm__, const HParser* parser, HInputStream* stream);