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; }
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()); }
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]); } */ } }
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); }
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); }
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); }