Example #1
0
/*
  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;
}
Example #2
0
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;
}
Example #3
0
/*
  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;
}
Example #4
0
/*
  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;
}
Example #5
0
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;
}