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