From b6cb84df15ec9444ae6387e07812f9bf6dddc5df Mon Sep 17 00:00:00 2001
From: Dan Hirsch <thequux@thequux.com>
Date: Sat, 12 May 2012 21:53:54 +0100
Subject: [PATCH] Added 'unimplemented' parser

---
 src/hammer.c | 39 ++++++++++++++++++++++++++++-----------
 src/hammer.h |  1 +
 src/pprint.c |  3 +++
 3 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/src/hammer.c b/src/hammer.c
index 58c7157e..0e48b85c 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -81,6 +81,23 @@ typedef struct {
   uint8_t len;
 } token_t;
 
+static parse_result_t* parse_unimplemented(void* env, parse_state_t *state) {
+  (void) env;
+  (void) state;
+  static parsed_token_t token = {
+    .token_type = TT_ERR
+  };
+  static parse_result_t result = {
+    .ast = &token
+  };
+  return &result;
+}
+
+static parser_t unimplemented = {
+  .fn = parse_unimplemented,
+  .env = NULL
+};
+
 static parse_result_t* parse_token(void *env, parse_state_t *state) {
   token_t *t = (token_t*)env;
   for (int i=0; i<t->len; ++i) {
@@ -145,7 +162,7 @@ const parser_t* whitespace(const parser_t* p) {
   return ret;
 }
 
-const parser_t* action(const parser_t* p, const action_t a) { return NULL; }
+const parser_t* action(const parser_t* p, const action_t a) { return &unimplemented; }
 
 static parse_result_t* parse_charset(void *env, parse_state_t *state) {
   uint8_t in = read_bits(&state->input_stream, 8, false);
@@ -441,16 +458,16 @@ const parser_t* xor(const parser_t* p1, const parser_t* p2) {
   return ret;
 }
 
-const parser_t* repeat0(const parser_t* p) { return NULL; }
-const parser_t* repeat1(const parser_t* p) { return NULL; }
-const parser_t* repeat_n(const parser_t* p, const size_t n) { return NULL; }
-const parser_t* optional(const parser_t* p) { return NULL; }
-const parser_t* ignore(const parser_t* p) { return NULL; }
-const parser_t* list(const parser_t* p, const parser_t* sep) { return NULL; }
-const parser_t* epsilon_p() { return NULL; }
-const parser_t* attr_bool(const parser_t* p, attr_bool_t a) { return NULL; }
-const parser_t* and(const parser_t* p) { return NULL; }
-const parser_t* not(const parser_t* p) { return NULL; }
+const parser_t* repeat0(const parser_t* p) { return &unimplemented; }
+const parser_t* repeat1(const parser_t* p) { return &unimplemented; }
+const parser_t* repeat_n(const parser_t* p, const size_t n) { return &unimplemented; }
+const parser_t* optional(const parser_t* p) { return &unimplemented; }
+const parser_t* ignore(const parser_t* p) { return &unimplemented; }
+const parser_t* list(const parser_t* p, const parser_t* sep) { return &unimplemented; }
+const parser_t* epsilon_p() { return &unimplemented; }
+const parser_t* attr_bool(const parser_t* p, attr_bool_t a) { return &unimplemented; }
+const parser_t* and(const parser_t* p) { return &unimplemented; }
+const parser_t* not(const parser_t* p) { return &unimplemented; }
 
 static guint cache_key_hash(gconstpointer key) {
   return djbhash(key, sizeof(parser_cache_key_t));
diff --git a/src/hammer.h b/src/hammer.h
index 6d68ab44..7c7e2967 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -57,6 +57,7 @@ typedef enum token_type {
   TT_SINT,
   TT_UINT,
   TT_SEQUENCE,
+  TT_ERR,
   TT_MAX
 } token_type_t;
 
diff --git a/src/pprint.c b/src/pprint.c
index cf39c0e9..a4fe43d5 100644
--- a/src/pprint.c
+++ b/src/pprint.c
@@ -102,6 +102,9 @@ static void unamb_sub(const parsed_token_t* tok, struct result_buf *buf) {
     len = asprintf(&tmpbuf, "s%#lx", tok->uint);
     append_buf(buf, tmpbuf, len);
     break;
+  case TT_ERR:
+    append_buf(buf, "ERR", 3);
+    break;
   case TT_SEQUENCE: {
     GSequenceIter *it;
     int at_begin = 1;
-- 
GitLab