diff --git a/src/parsers/optional.c b/src/parsers/optional.c index 0b405e5..3d3e9f6 100644 --- a/src/parsers/optional.c +++ b/src/parsers/optional.c @@ -21,10 +21,19 @@ static bool opt_isValidCF(void *env) { return p->vtable->isValidCF(p->env); } +static bool opt_ctrvm(struct HRVMProg_ *prog, void* env) { + uint16_t insn = h_rvm_insert_insn(prog, RVM_FORK, 0); + if (!h_compile_regex(prog, (HParser*)env->env)) + return false; + h_rvm_patch_arg(prog, insn, h_rvm_get_ip(prog)); + return true; +} + static const HParserVtable optional_vt = { .parse = parse_optional, .isValidRegular = opt_isValidRegular, .isValidCF = opt_isValidCF, + .compile_to_rvm = opt_ctvrm, }; const HParser* h_optional(const HParser* p) { diff --git a/src/parsers/sequence.c b/src/parsers/sequence.c index f5e1924..61b74ec 100644 --- a/src/parsers/sequence.c +++ b/src/parsers/sequence.c @@ -42,10 +42,20 @@ static bool sequence_isValidCF(void *env) { return true; } +static bool sequence_ctrvm(struct HRVMProg_ *prog, void* env) { + HSequence *s = (HSequence*)env; + for (size_t i=0; ilen; ++i) { + if (!s->p_array[i]->vtable->compile_to_rvm(prog, s->p_array[i]->env)) + return false; + } + return true; +} + static const HParserVtable sequence_vt = { .parse = parse_sequence, .isValidRegular = sequence_isValidRegular, .isValidCF = sequence_isValidCF, + .compile_to_rvm = sequence_ctrvm, }; const HParser* h_sequence(const HParser* p, ...) {