struct TrieNode * root = getNode(); struct TrieNode * sub_root = getNode(); // i: // s1 insert(sub_root, "1", 0, rule_0); // s2, b, restore point insert(rule_0, "2", 1, rule_1); // C // s3 insert(rule_1, "3", 2, rule_2); // s5 insert(rule_2, "5", 3, rule_3); // link to next statement, which happens to be a definition // C // s2, restore point insert(rule_0, "2", 1, rule_4); // s8 insert(rule_4, "8", 2, rule_5); // s5 insert(rule_5, "5", 3, rule_3); // link to next statement, which happens to be a definition // e // s9, b, restore point, because that this is directly after a previous branch the restore point is set to the start of this branch // C // s9 insert(rule_3, "9", 2, rule_4); // s1 insert(rule_4, "1", 3, rule_5); // link to end // C // s9, restore point insert(rule_3, "9", 2, rule_6); // s9 insert(rule_6, "9", 2, rule_7); // s2 insert(rule_7, "2", 3, rule_5); // link to end // s6, end of rule insert(rule_5, "6", 2, NULL);