diff --git a/src/hammer.c b/src/hammer.c
index 228f06ba1037e42139a38f8a3d940f00ef94777d..f6cffd850b4bf8b9c556b01135e9e7691cc810d1 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -468,8 +468,6 @@ 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* chain(const parser_t* p1, const parser_t* p2, const parser_t* p3) { return NULL; }
-const parser_t* chainl(const parser_t* p1, const parser_t* p2) { 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; }
@@ -735,14 +733,6 @@ static void test_ignore(void) {
   g_check_parse_failed(ignore_, "ac", 2);
 }
 
-static void test_chain(void) {
-
-}
-
-static void test_chainl(void) {
-
-}
-
 static void test_list(void) {
   const parser_t *list_ = list(choice(ch('1'), ch('2'), ch('3'), NULL), ch(','));
 
@@ -816,8 +806,6 @@ void register_parser_tests(void) {
   g_test_add_func("/core/parser/repeat1", test_repeat1);
   g_test_add_func("/core/parser/repeat_n", test_repeat_n);
   g_test_add_func("/core/parser/optional", test_optional);
-  g_test_add_func("/core/parser/chain", test_chain);
-  g_test_add_func("/core/parser/chainl", test_chainl);
   g_test_add_func("/core/parser/list", test_list);
   g_test_add_func("/core/parser/epsilon_p", test_epsilon_p);
   g_test_add_func("/core/parser/attr_bool", test_attr_bool);
diff --git a/src/hammer.h b/src/hammer.h
index abf0b2cf5bb93de5941fd770a6b94999742c1290..57a0aebd762ff9335c33b4b0fe386a94b14790ff 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -188,9 +188,6 @@ const parser_t* optional(const parser_t* p);
 /* Given a parser, p, this parser succeeds if p succeeds, but doesn't include p's result in the result. */
 const parser_t* ignore(const parser_t* p);
 
-const parser_t* chain(const parser_t* p1, const parser_t* p2, const parser_t* p3);
-const parser_t* chainl(const parser_t* p1, const parser_t* p2);
-
 /* Given a parser, p, and a parser for a separator, sep, this parser matches a list of things that p can parse, separated by sep.
  * For example, if p is repeat1(range('0','9')) and sep is ch(','), list(p, sep) will match a comma-separated list of integers. 
  */