/* nfa state map: rule a? |------------------ε-------------------| | ∨ <start> --ε--> <s1> --a--> <s2> --ε--> <end> */ static size_t _gen_op_rpq(struct reg_pattern* pattern, struct reg_ast_node* root, size_t start_state_pos){ size_t s1_pos = _node_new(pattern); _node_insert(pattern, start_state_pos, NULL, s1_pos); size_t s2_pos = _gen_op(pattern, root->childs[0], s1_pos); size_t end_pos = _node_new(pattern); _node_insert(pattern, start_state_pos, NULL, end_pos); _node_insert(pattern, s2_pos, NULL, end_pos); return end_pos; }
static size_t _gen_nfa(struct reg_pattern* pattern, struct reg_ast_node* root){ size_t head = _node_new(pattern); size_t end = _gen_op(pattern, root, head); struct reg_node* node = state_node_pos(pattern, end); node->is_end = 1; return head; }
/* nfa state map: rule: ab --ε--> <start> --a--> <s1> --ε--> <s2> --b--> <end> */ static size_t _gen_op_and(struct reg_pattern* pattern, struct reg_ast_node* root, size_t start_state_pos){ assert(root->op == op_and); size_t s1_pos = _gen_op(pattern, root->childs[0], start_state_pos); size_t s2_pos = _node_new(pattern); _node_insert(pattern, s1_pos, NULL, s2_pos); size_t end = _gen_op(pattern, root->childs[1], s2_pos); return end; }
/* nfa state map: rule: [a-b] <start> --[a-b]--> <end> */ static size_t _gen_op_range(struct reg_pattern* pattern, struct reg_ast_node* root, size_t start_state_pos){ assert(root->op == op_range); struct reg_range* range = &(root->value.range); size_t end_pos = _node_new(pattern); int is_insert = 0; is_insert = _node_insert(pattern, start_state_pos, range, end_pos); assert(is_insert); return end_pos; }
Node *new_node(enum TYPE_T type, void *data) { Node *n = _node_new(); switch (type) { case NUMBER: _node_set_type(n, NUMBER); _node_set_data_int(n, data); //return *n; break; case WORD: _node_set_type(n, WORD); _node_set_data_string(n, data); //return *n; break; default: printf("error: unknown type\n"); // something somethinng, fprintf blah } return n; }