From 31256ba867b4e06feeb0ae953c74032e80184c04 Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Mon, 20 May 2013 14:44:18 +0200
Subject: [PATCH] reshape for h_left and friends

---
 src/cfgrammar.c          |  3 ++-
 src/parsers/ignoreseq.c  | 26 ++++++++++++++++++++++++++
 src/parsers/whitespace.c |  4 +++-
 3 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/src/cfgrammar.c b/src/cfgrammar.c
index b4a3aef3..67361c83 100644
--- a/src/cfgrammar.c
+++ b/src/cfgrammar.c
@@ -37,7 +37,8 @@ static void collect_nts(HCFGrammar *grammar, HCFChoice *symbol);
 static void collect_geneps(HCFGrammar *grammar);
 
 
-static const HParsedToken *h_act_first(const HParseResult *p)
+// XXX to be consolidated with glue.c when merged upstream
+const HParsedToken *h_act_first(const HParseResult *p)
 {
   assert(p->ast);
   assert(p->ast->token_type == TT_SEQUENCE);
diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c
index 95e54b89..e4bf4323 100644
--- a/src/parsers/ignoreseq.c
+++ b/src/parsers/ignoreseq.c
@@ -2,6 +2,10 @@
 #include "parser_internal.h"
 
 
+// XXX I'm thinking these parsers should be removed entirely in favor of an
+//     equivalent family of HActions.  --pesco
+
+
 //
 // general case: parse sequence, pick one result
 //
@@ -27,6 +31,18 @@ static HParseResult* parse_ignoreseq(void* env, HParseState *state) {
   return res;
 }
 
+extern const HParsedToken *h_act_first(const HParseResult *p);
+extern const HParsedToken *h_act_last(const HParseResult *p);
+
+// XXX to be consolidated with glue.c when merged upstream
+const HParsedToken *h_act_second(const HParseResult *p) {
+  assert(p->ast);
+  assert(p->ast->token_type == TT_SEQUENCE);
+  assert(p->ast->seq->used > 0);
+
+  return p->ast->seq->elements[1];
+}
+
 static HCFChoice* desugar_ignoreseq(HAllocator *mm__, void *env) {
   HIgnoreSeq *seq = (HIgnoreSeq*)env;
   HCFSequence *hseq = h_new(HCFSequence, 1);
@@ -41,6 +57,16 @@ static HCFChoice* desugar_ignoreseq(HAllocator *mm__, void *env) {
   ret->seq[0] = hseq;
   ret->seq[1] = NULL;
   ret->action = NULL;
+
+  if(seq->which == 0)
+    ret->reshape = h_act_first;
+  else if(seq->which == 1)
+    ret->reshape = h_act_second;    // for h_middle
+  else if(seq->which == seq->len-1)
+    ret->reshape = h_act_last;
+  else
+    ret->reshape = NULL;    // XXX
+
   return ret;
 }
 
diff --git a/src/parsers/whitespace.c b/src/parsers/whitespace.c
index 6115e09f..f9fa59f6 100644
--- a/src/parsers/whitespace.c
+++ b/src/parsers/whitespace.c
@@ -17,9 +17,11 @@ static HParseResult* parse_whitespace(void* env, HParseState *state) {
 
 static const char SPACE_CHRS[6] = {' ', '\f', '\n', '\r', '\t', '\v'};
 
-static const HParsedToken *h_act_last(const HParseResult *p) {
+// XXX to be consolidated with glue.c when merged upstream
+const HParsedToken *h_act_last(const HParseResult *p) {
   assert(p->ast);
   assert(p->ast->token_type == TT_SEQUENCE);
+  assert(p->ast->seq->used > 0);
 
   return p->ast->seq->elements[p->ast->seq->used-1];
 }
-- 
GitLab