From 8a5c4b6b679d05b538d1b67e6bc63f43d46bb6fc Mon Sep 17 00:00:00 2001 From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com> Date: Mon, 18 Mar 2013 01:02:59 -0400 Subject: [PATCH] beginnings of translating parser combinators to regex vm instructions --- src/parsers/optional.c | 9 +++++++++ src/parsers/sequence.c | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/parsers/optional.c b/src/parsers/optional.c index 0b405e5a..3d3e9f6a 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 f5e19246..61b74ec5 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; i<s->len; ++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, ...) { -- GitLab