Skip to content
Snippets Groups Projects
action.c 1.34 KiB
Newer Older
Dan Hirsch's avatar
Dan Hirsch committed
#include "parser_internal.h"

typedef struct {
  const HParser *p;
  HAction action;
} HParseAction;

static HParseResult* parse_action(void *env, HParseState *state) {
  HParseAction *a = (HParseAction*)env;
  if (a->p && a->action) {
    HParseResult *tmp = h_do_parse(a->p, state);
    //HParsedToken *tok = a->action(h_do_parse(a->p, state));
    if(tmp) {
        const HParsedToken *tok = a->action(tmp);
        return make_result(state, (HParsedToken*)tok);
    } else
      return NULL;
Dan Hirsch's avatar
Dan Hirsch committed
  } else // either the parser's missing or the action's missing
    return NULL;
}

static bool action_isValidRegular(void *env) {
  HParseAction *a = (HParseAction*)env;
  return a->p->vtable->isValidRegular(a->p->env);
}

static bool action_isValidCF(void *env) {
  HParseAction *a = (HParseAction*)env;
  return a->p->vtable->isValidCF(a->p->env);
}

Dan Hirsch's avatar
Dan Hirsch committed
static const HParserVtable action_vt = {
  .parse = parse_action,
  .isValidRegular = action_isValidRegular,
  .isValidCF = action_isValidCF,
const HParser* h_action(const HParser* p, const HAction a) {
  return h_action__m(&system_allocator, p, a);
}

const HParser* h_action__m(HAllocator* mm__, const HParser* p, const HAction a) {
  HParser *res = h_new(HParser, 1);
Dan Hirsch's avatar
Dan Hirsch committed
  res->vtable = &action_vt;
  HParseAction *env = h_new(HParseAction, 1);
Dan Hirsch's avatar
Dan Hirsch committed
  env->p = p;
  env->action = a;
  res->env = (void*)env;
  return res;
}