diff --git a/src/hammer.c b/src/hammer.c
index ced1a23db2bb4aff1fdec64cd0dbb098520f0260..5933e1ccab0507a9e12bba092755fbd456653664 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -463,7 +463,22 @@ 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; }
+
+static parse_result_t* parse_ignore(void* env, parse_state_t* state) {
+  parse_result_t *res0 = do_parse((parser_t*)env, state);
+  if (!res0)
+    return NULL;
+  parse_result_t *res = a_new(parse_result_t, 1);
+  res->ast = NULL;
+  res->arena = state->arena;
+  return res;
+}
+const parser_t* ignore(const parser_t* p) {
+  parser_t* ret = g_new(parser_t, 1);
+  ret->fn = parse_ignore;
+  ret->env = (void*)p;
+  return ret;
+}
 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; }