return 1;
 }
 
+static size_t ec_node_int_get_max_parse_len(const struct ec_node *gen_node)
+{
+       (void)gen_node;
+       return 1;
+}
+
 static struct ec_node_type ec_node_int_type = {
        .name = "int",
        .parse = ec_node_int_parse,
        .complete = ec_node_default_complete,
+       .get_max_parse_len = ec_node_int_get_max_parse_len,
        .size = sizeof(struct ec_node_int),
 };
 
 
        return completed;
 }
 
+static size_t ec_node_or_get_max_parse_len(const struct ec_node *gen_node)
+{
+       struct ec_node_or *node = (struct ec_node_or *)gen_node;
+       size_t i, ret = 0, len;
+
+       for (i = 0; i < node->len; i++) {
+               len = ec_node_get_max_parse_len(node->table[i]);
+               if (len > ret)
+                       ret = len;
+       }
+
+       return ret;
+}
+
 static void ec_node_or_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_or *node = (struct ec_node_or *)gen_node;
        .name = "or",
        .parse = ec_node_or_parse,
        .complete = ec_node_or_complete,
+       .get_max_parse_len = ec_node_or_get_max_parse_len,
        .size = sizeof(struct ec_node_or),
        .free_priv = ec_node_or_free_priv,
 };
 
        return 1;
 }
 
+static size_t ec_node_re_get_max_parse_len(const struct ec_node *gen_node)
+{
+       (void)gen_node;
+       return 1;
+}
+
 static void ec_node_re_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_re *node = (struct ec_node_re *)gen_node;
        .name = "re",
        .parse = ec_node_re_parse,
        .complete = ec_node_default_complete,
+       .get_max_parse_len = ec_node_re_get_max_parse_len,
        .size = sizeof(struct ec_node_re),
        .free_priv = ec_node_re_free_priv,
 };
 
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <string.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <ecoli_completed.h>
 #include <ecoli_node_str.h>
 #include <ecoli_node_option.h>
+#include <ecoli_node_or.h>
+#include <ecoli_node_many.h>
 #include <ecoli_node_seq.h>
 
 struct ec_node_seq {
        struct ec_node gen;
        struct ec_node **table;
-       unsigned int len;
+       size_t len;
 };
 
 static int
        return __ec_node_seq_complete(node->table, node->len, state, strvec);
 }
 
+static size_t ec_node_seq_get_max_parse_len(const struct ec_node *gen_node)
+{
+       struct ec_node_seq *node = (struct ec_node_seq *)gen_node;
+       size_t i, len, ret = 0;
+
+       for (i = 0; i < node->len; i++) {
+               len = ec_node_get_max_parse_len(node->table[i]);
+               if (len <= SIZE_MAX - ret)
+                       ret += len;
+               else
+                       ret = SIZE_MAX;
+       }
+
+       return ret;
+}
+
 static void ec_node_seq_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_seq *node = (struct ec_node_seq *)gen_node;
        .name = "seq",
        .parse = ec_node_seq_parse,
        .complete = ec_node_seq_complete,
+       .get_max_parse_len = ec_node_seq_get_max_parse_len,
        .size = sizeof(struct ec_node_seq),
        .free_priv = ec_node_seq_free_priv,
 };
 
 
        (void)state;
 
-       if (ec_strvec_len(strvec) == 0)
+       if (ec_strvec_len(strvec) != 1)
                return EC_PARSED_NOMATCH;
 
        str = ec_strvec_val(strvec, 0);
        ec_free(node->string);
 }
 
+static size_t ec_node_str_get_max_parse_len(const struct ec_node *gen_node)
+{
+       (void)gen_node;
+       return 1;
+}
+
 static struct ec_node_type ec_node_str_type = {
        .name = "str",
        .parse = ec_node_str_parse,
        .complete = ec_node_str_complete,
+       .get_max_parse_len = ec_node_str_get_max_parse_len,
        .desc = ec_node_str_desc,
        .size = sizeof(struct ec_node_str),
        .free_priv = ec_node_str_free_priv,