Example #1
0
StateMachinePtr construct_sm(BindingsPtr bindings, NodePtr root,
      std::size_t id, const AbstractStateMachineTable& asmt) {
   assert(root && root->get_op() == Op::state_machine);
   assert(root->size() == 5 || root->size() == 6);
   int argi = 0;
   std::string name = root->get_operand(argi++)->get_token().get_text();
   std::string base_sm;
   if (root->size() == 6) {
      base_sm = root->get_operand(argi++)->get_token().get_text();
   }
   NodePtr states = root->get_operand(argi++);
   NodePtr vars = root->get_operand(argi++);
   NodePtr funcs = root->get_operand(argi++);
   NodePtr rules = root->get_operand(argi++);
   StateMachinePtr sm = std::make_shared<StateMachine>(bindings, name, id);
   if (base_sm != "") {
      AbstractStateMachineTable::const_iterator it = asmt.find(base_sm);
      if (it == asmt.end()) {
	 throw Exception(root->get_operand(1)->get_location(),
	    "no such abstract state machine");
      }
      sm->import_asm(it->second);
   }
   add_states(sm, states);
   assert(vars->get_op() == Op::sm_vars);
   if (vars->size() > 0) {
      add_vars(sm, vars->get_operand(0));
   }
   assert(funcs->get_op() == Op::sm_functions);
   if (funcs->size() > 0) {
      add_functions(sm, funcs->get_operand(0));
   }
   add_rules(sm, bindings, rules);
   return sm;
}
Example #2
0
static void add_states(StateMachinePtr sm, NodePtr root) {
   if (!root->is_leaf() && root->get_op() == Op::states) {
      add_states(sm, root->get_operand(0));
      root = root->get_operand(1);
   }
   sm->add_state(root->get_token().get_text(), root->get_location());
}
Example #3
0
void
mkdfa(info_t *infos, int ninfos, int useprefix, int debug)
{
  /*
     static const char *names[] =
     {
     "foo",
     "bar",
     "foobar",
     "argh",
     "filep",
     };
     static int nnames = SIZEOF (names);
     const char *accept;
   */

  int i;

  start = mkstate();

  for (i = 0; i < (ninfos - 1); i++)
    infos[i].namelen = strlen(infos[i].name);

  for (i = 0; i < (ninfos - 1); i++)
    add_states(start, &infos[i], 0);

  mktables(start, infos[ninfos - 1].value, useprefix);

  if (debug) {
    printf("\n/*\n");
    prstate(start);
    printf("*/\n");

    /*
       for (i = 0; i < ninfos; i++)
       {
       accept = rundfa (infos[i].name, infos[i].namelen);
       if (accept)
       printf ("%s\n", accept);
       else
       printf ("%s not accepted\n", infos[i].name);
       }

       for (i = 0; i < nnames; i++)
       {
       accept = rundfa (names[i], strlen (names[i]));
       if (accept)
       printf ("%s\n", accept);
       else
       printf ("%s not accepted\n", names[i]);
       }
     */
  }
}
Example #4
0
void
add_states(state_t *state, info_t *info, int pos)
{
  transition_t *transitions;

  if (info->namelen == pos) {
    state->value = info->value;
    return;
  }

  transitions = state->transitions;
  while (transitions) {
    if (tolower(transitions->value) == tolower(info->name[pos])) {
      if ((transitions->state->value && (info->namelen == (pos + 1))) || (info->namelen != (pos + 1))) {
        add_states(transitions->state, info, pos + 1);
        return;
      }
    }

    transitions = transitions->next;
  }

  if (state->transitions) {
    transitions = state->transitions;
    while (transitions->next)
      transitions = transitions->next;

    transitions->next = mktransition();
    transitions       = transitions->next;
  } else {
    transitions        = mktransition();
    state->transitions = transitions;
  }

  transitions->value = info->name[pos];
  transitions->state = mkstate();

  add_states(transitions->state, info, pos + 1);
}
Example #5
0
void test_trie_tree_states()
{
  int states1[5] = {1, 2, 3, 4, 5};
  int states2[4] = {3, 6, 8, 7};
  int states3[5] = {1, 2, 5, 8, 9};
  int states4[5] = {3, 7, 9, 2, 5};

  int fs1[5] = {1, 2, 3, 4, 5};
  int fs2[6] = {1, 2, 3, 4, 5, 7};
  int fs3[3] = {1, 2, 5};
  int fs4[4] = {1, 2, 3, 4};
  int fs5[5] = {1, 2, 5, 8, 7};
  int fs6[5] = {3, 7, 9, 2, 5};

  int r;
  struct tstate_s tstate;
  struct trie_s* trie;
  
  trie = create_trie(wordimage);
  
  /* add states */
  tstate.states = states1;
  tstate.statecount = 5;
  tstate.userdata.freq = 4;
  tstate.userdata.POS = 10;
  r = add_states(trie, &tstate);
  CHECK("check add states1", r > 0);
  tstate.states = states2;
  tstate.statecount = 4;
  tstate.userdata.freq = 3;
  r = add_states(trie, &tstate);
  CHECK("check add states2", r > 0);
  tstate.states = states3;
  tstate.statecount = 5;
  tstate.userdata.freq = 2;
  r = add_states(trie, &tstate);
  CHECK("check add states3", r > 0);
  tstate.states = states4;
  tstate.statecount = 5;
  tstate.userdata.freq = 1;
  r = add_states(trie, &tstate);
  CHECK("check add states4", r > 0);

  
  /* find states */
  tstate.states = fs1;
  tstate.statecount = 5;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs1", r == 1 && tstate.userdata.freq == 4 && tstate.userdata.POS == 10);
  tstate.states = fs2;
  tstate.statecount = 6;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs2", r == 0 && tstate.userdata.freq == 0);
  tstate.states = fs3;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs3", r == 1 && tstate.userdata.freq == 0);
  tstate.states = fs4;
  tstate.statecount = 4;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs4", r == 1 && tstate.userdata.freq == 0);
  tstate.states = fs5;
  tstate.statecount = 5;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs5", r == 0 && tstate.userdata.freq == 0);
  tstate.states = fs6;
  tstate.statecount = 5;
  tstate.userdata.freq = 0;
  r = find_states(trie, &tstate);
  CHECK("check find fs5", r == 1 && tstate.userdata.freq == 1);

  /* trie tree sort */
  struct trie_state_s* sortlist = get_sort_state_list(trie);

  r = sortlist->nscount;
  CHECK("sort result 8", r == 16);
  sortlist = sortlist->sortnext;  
  r = sortlist->nscount;
  CHECK("sort result 7", r == 7);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 7", r == 7);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 6", r == 6);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 3", r == 3);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 2", r == 2);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 1", r == 1);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);
  sortlist = sortlist->sortnext;
  r = sortlist->nscount;
  CHECK("sort result 0", r == 0);

  clear_trie(trie);  
}
Example #6
0
void test_datrie_states()
{
  int states1[2] = {1, 1};
  int states2[3] = {1, 1, 2};
  int states3[3] = {1, 1, 4};
  int states4[2] = {2, 3};
  int states5[2] = {2, 5};
  int states6[3] = {2, 5, 4};
  int states7[2] = {3, 4};

  int fs1[2] = {1, 1};
  int fs2[3] = {1, 1, 2};
  int fs3[3] = {1, 1, 4};
  int fs4[2] = {2, 3};
  int fs5[2] = {2, 5};
  int fs6[3] = {2, 5, 4};
  int fs7[2] = {3, 4};

  int fs8[1] = {1}; 
  int fs9[3] = {1, 2, 3};
  int fs10[3] = {1, 1, 3};

  int r;
  struct tstate_s tstate;
  struct trie_s* trie;
  struct datrie_s* datrie;
  struct trie_state_s* state_list;
  struct stateslot_s stateslot;
  
  trie = create_trie(wordimage);
  /* add states */
  tstate.states = states1;
  tstate.statecount = 2;
  tstate.userdata.freq = 7;
  r = add_states(trie, &tstate);
  CHECK("check add states1", r > 0);
  tstate.states = states2;
  tstate.statecount = 3;
  tstate.userdata.freq = 6;
  r = add_states(trie, &tstate);
  CHECK("check add states2", r > 0);
  tstate.states = states3;
  tstate.statecount = 3;
  tstate.userdata.freq = 5;
  r = add_states(trie, &tstate);
  CHECK("check add states3", r > 0);
  tstate.states = states4;
  tstate.statecount = 2;
  tstate.userdata.freq = 4;
  r = add_states(trie, &tstate);
  CHECK("check add states4", r > 0);
  tstate.states = states5;
  tstate.statecount = 2;
  tstate.userdata.freq = 3;
  r = add_states(trie, &tstate);
  CHECK("check add states5", r > 0);
  tstate.states = states6;
  tstate.statecount = 3;
  tstate.userdata.freq = 2;
  r = add_states(trie, &tstate);
  CHECK("check add states6", r > 0);
  tstate.states = states7;
  tstate.statecount = 2;
  tstate.userdata.freq = 1;
  r = add_states(trie, &tstate);
  CHECK("check add states7", r > 0);

  trie_out_text(trie, NULL);
  datrie = create_datrie(wordimage, NULL, get_userdata_count(trie), 1, 0);
  state_list = get_sort_state_list(trie);
  build_state_list(datrie, state_list);
  
  /* find state */
  stateslot.s = 1;
  stateslot.userdata.freq = 0;
  r = dat_find_state(datrie, &stateslot, 1);
  CHECK("check find state=1", r == 1 && stateslot.userdata.freq == 0);
  r = dat_find_state(datrie, &stateslot, 1);
  CHECK("check find state=1", r == 2 && stateslot.userdata.freq == 7);
  r = dat_find_state(datrie, &stateslot, 4);
  CHECK("check find state=4", r == 2 && stateslot.userdata.freq == 5);

  /* find states */
  tstate.states = fs1;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states1", r == 2 && tstate.userdata.freq == 7);
  tstate.states = fs2;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states2", r == 2 && tstate.userdata.freq == 6);
  tstate.states = fs3;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states3", r == 2 && tstate.userdata.freq == 5);
  tstate.states = fs4;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states4", r == 2 && tstate.userdata.freq == 4);
  tstate.states = fs5;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states5", r == 2 && tstate.userdata.freq == 3);
  tstate.states = fs6;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states6", r == 2 && tstate.userdata.freq == 2);
  tstate.states = fs7;
  tstate.statecount = 2;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states7", r == 2 && tstate.userdata.freq == 1);
  tstate.states = fs8;
  tstate.statecount = 1;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states8", r == 1 && tstate.userdata.freq == 0);
  tstate.states = fs9;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states9", r == 0 && tstate.userdata.freq == 0);
  tstate.states = fs10;
  tstate.statecount = 3;
  tstate.userdata.freq = 0;
  r = dat_find_states(datrie, &tstate);
  CHECK("check find states10", r == 0 && tstate.userdata.freq == 0);
  

  clear_datrie(datrie);
  clear_trie(trie);
}