diff --git a/examples/glue.c b/examples/glue.c
index 29b8de7180863a5014acff87ac3a1ee2515a085e..4cc85d089046cd759617d6b39f4d822c609b7e30 100644
--- a/examples/glue.c
+++ b/examples/glue.c
@@ -74,6 +74,7 @@ const HParsedToken *h_act_flatten(const HParseResult *p) {
   return h_seq_flatten(p->arena, p->ast);
 }
 
+// Low-level helper for the h_make family.
 HParsedToken *h_make_(HArena *arena, HTokenType type)
 {
   HParsedToken *ret = h_arena_malloc(arena, sizeof(HParsedToken));
@@ -81,6 +82,14 @@ HParsedToken *h_make_(HArena *arena, HTokenType type)
   return ret;
 }
 
+HParsedToken *h_make(HArena *arena, HTokenType type, void *value)
+{
+  assert(type >= TT_USER);
+  HParsedToken *ret = h_make_(arena, type);
+  ret->user = value;
+  return ret;
+}
+
 HParsedToken *h_make_seq(HArena *arena)
 {
   HParsedToken *ret = h_make_(arena, TT_SEQUENCE);
@@ -88,13 +97,29 @@ HParsedToken *h_make_seq(HArena *arena)
   return ret;
 }
 
-HParsedToken *h_make(HArena *arena, HTokenType type, void *value)
+HParsedToken *h_make_bytes(HArena *arena, size_t len)
 {
-  HParsedToken *ret = h_make_(arena, type);
-  ret->user = value;
+  HParsedToken *ret = h_make_(arena, TT_BYTES);
+  ret->bytes.len = len;
+  ret->bytes.token = h_arena_malloc(arena, len);
+  return ret;
+}
+
+HParsedToken *h_make_sint(HArena *arena, int64_t val)
+{
+  HParsedToken *ret = h_make_(arena, TT_SINT);
+  ret->sint = val;
+  return ret;
+}
+
+HParsedToken *h_make_uint(HArena *arena, uint64_t val)
+{
+  HParsedToken *ret = h_make_(arena, TT_UINT);
+  ret->uint = val;
   return ret;
 }
 
+// XXX -> internal
 HParsedToken *h_carray_index(const HCountedArray *a, size_t i)
 {
   assert(i < a->used);
diff --git a/examples/glue.h b/examples/glue.h
index d428e06def7e69390295367bac261a085ee27b2e..9b11315f7f60b766a8c3f68dbd08f1b487a47d0c 100644
--- a/examples/glue.h
+++ b/examples/glue.h
@@ -51,9 +51,16 @@ const HParsedToken *h_act_flatten(const HParseResult *p);
 
 HParsedToken *h_make(HArena *arena, HTokenType type, void *value);
 HParsedToken *h_make_seq(HArena *arena);  // Makes empty sequence.
-
-// Standard short-hand to make a user-type token.
-#define H_MAKE(TYP, VAL) h_make(p->arena, TT_ ## TYP, VAL)
+HParsedToken *h_make_bytes(HArena *arena, size_t len);
+HParsedToken *h_make_sint(HArena *arena, int64_t val);
+HParsedToken *h_make_uint(HArena *arena, uint64_t val);
+
+// Standard short-hands to make tokens in an action.
+#define H_MAKE(TYP, VAL)  h_make(p->arena, TT_ ## TYP, VAL)
+#define H_MAKE_SEQ()      h_make_seq(p->arena)
+#define H_MAKE_BYTES(LEN) h_make_bytes(p->arena, LEN)
+#define H_MAKE_SINT(VAL)  h_make_sint(p->arena, VAL)
+#define H_MAKE_UINT(VAL)  h_make_uint(p->arena, VAL)
 
 // Sequence access...