diff --git a/examples/grammar.c b/examples/grammar.c
index f722edf07700154f0d53686a4e1a58fe9a29f3d3..7638fe99558149d9e2d47e5d1dc7f0299da189c1 100644
--- a/examples/grammar.c
+++ b/examples/grammar.c
@@ -20,7 +20,8 @@
 #include <stdio.h>
 
 const char *nonterminal_name(const HCFGrammar *g, const HCFChoice *nt) {
-  if(nt->user_data != NULL) {
+  // if user_data exists and is printable:
+  if(nt->user_data != NULL && *(char*)(nt->user_data) > ' ' && *(char*)(nt->user_data) < 127) {
     if(*(char*)(nt->user_data) != '0') {
       // user_data is a non-empty string
       return nt->user_data;
@@ -80,7 +81,7 @@ void readsequence(FILE *file, uint32_t *count, uint32_t *length,
 	*count *= cscount;
 	break;
       default: // HCF_CHOICE, non-terminal symbol
-	fprintf(file, "*%s(t)", nonterminal_name(g, *x));
+	fprintf(file, "*%s", nonterminal_name(g, *x));
 	break;
       }
     }
@@ -101,19 +102,48 @@ void h_pprint_gfeqns(FILE *file, const HCFGrammar *g) {
   // determine maximum string length of symbol names
   int len;
   size_t s;
-  for(len=1, s=26; s < g->nts->used; len++, s*=26); 
+  for(len=1, s=26; s < g->nts->used; len++, s*=26);
 
-  // iterate over g->nts
+  // emit the SageMath ring init string
+  // iterate over g->nts, output symbols
   size_t i;
-  HHashTableEntry *hte;
+  HHashTableEntry *hte;  
+  fprintf(file, "ring.<t");
+  for(i=0; i < g->nts->capacity; i++) {
+    for(hte = &g->nts->contents[i]; hte; hte = hte->next) {
+      if (hte->key == NULL) {
+        continue;
+      }
+      const HCFChoice *nt = hte->key;
+      fprintf(file, ",");
+      
+      fprintf(file, "%s", nonterminal_name(g, nt));
+    }
+  }
+  fprintf(file, "> = QQ[]\n");
+      
+  
+  // iterate over g->nts
+  // emit a Sage ideal definition
+  int j=0;
+  fprintf(file, "ID = ring.ideal(");
   for(i=0; i < g->nts->capacity; i++) {
     for(hte = &g->nts->contents[i]; hte; hte = hte->next) {
       if (hte->key == NULL) {
         continue;
       }
 
+      if(j>0) {
+	fprintf(file, ",");
+      }
+      j++;
+      
       const HCFChoice *nt = hte->key;
-      fprintf(file, "%s(t) = ", nonterminal_name(g, nt));
+      const char *ntn = nonterminal_name(g, nt);
+      if(*ntn == 0) {
+	continue;
+      }
+      fprintf(file, "%s - (", ntn);
 
       
       for(HCFSequence **seq = nt->seq; *seq; seq++) {
@@ -142,7 +172,8 @@ void h_pprint_gfeqns(FILE *file, const HCFGrammar *g) {
 	}
       }
 
-      fprintf(file, "\n");
+      fprintf(file, ")");
     }
   }
+  fprintf(file, ")\n");
 }
diff --git a/examples/ties.c b/examples/ties.c
index 09f6b70728d3a039e86defe9522db73873af61e1..77d0821212e6d5a6145ee9184cfb26b02be3d786 100644
--- a/examples/ties.c
+++ b/examples/ties.c
@@ -47,6 +47,18 @@ HParser* finkmao() {
   h_bind_indirect(Rnext, R_);
   h_bind_indirect(Cnext, C_);
   HParser *tie = h_sequence(L, Lnext, NULL);
+
+  h_desugar_augmented(mm__, tie);
+
+  L->desugared->user_data = "L";
+  R->desugared->user_data = "R";
+  C->desugared->user_data = "C";
+  Lnext->desugared->user_data = "Ln";
+  Rnext->desugared->user_data = "Rn";
+  Cnext->desugared->user_data = "Cn";
+  tie->desugared->user_data = "tie";
+  U->desugared->user_data = "0U";
+  
   return tie;
 }
 
@@ -103,7 +115,20 @@ HParser* depth1TW() {
 			      h_epsilon_p(),
 			      NULL);
   h_bind_indirect(tuckpairstar, tpstar_);
-  return h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
+  HParser *tie = h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
+
+  h_desugar_augmented(mm__, tie);
+  
+  T->desugared->user_data = "T";
+  W->desugared->user_data = "W";
+  U->desugared->user_data = "0U";
+  prefix->desugared->user_data = "prefix";
+  pair->desugared->user_data = "pair";
+  tuck->desugared->user_data = "tuck";
+  tpstar_->desugared->user_data = "tuckpairstar";
+  tie->desugared->user_data = "tie";
+
+  return tie;
 }
 
 HParser* depth1() {
@@ -144,10 +169,23 @@ HParser* depth1() {
   h_bind_indirect(lastR, R_);
   h_bind_indirect(lastL, L_);
   h_bind_indirect(lastC, C_);
-  return h_choice(h_sequence(L, lastL, NULL),
+  HParser* tie = h_choice(h_sequence(L, lastL, NULL),
 		  h_sequence(R, lastR, NULL),
 		  h_sequence(C, lastC, NULL),
 		  NULL);
+
+  h_desugar_augmented(mm__, tie);
+
+  L->desugared->user_data = "L";
+  R->desugared->user_data = "R";
+  C->desugared->user_data = "C";
+  U->desugared->user_data = "0U";
+  lastL ->desugared->user_data = "Ln";
+  lastR->desugared->user_data = "Rn";
+  lastC->desugared->user_data = "Cn";
+  tie->desugared->user_data = "tie";
+
+  return tie;
 }
 
 HParser* depthNTW() {
@@ -237,14 +275,27 @@ HParser* depthNTW() {
 			      NULL);
   h_bind_indirect(tuckpairstar, tpstar_);
 			      
-  return h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
+  HParser *tie = h_choice(h_sequence(prefix, tuckpairstar, tuck, NULL), NULL);
+
+  h_desugar_augmented(mm__, tie);
+
+  T->desugared->user_data = "T";
+  W->desugared->user_data = "W";
+  U->desugared->user_data = "0U";
+  prefix->desugared->user_data = "prefix";
+  pair->desugared->user_data = "pair";
+  tuck->desugared->user_data = "tuck";
+  tpstar_->desugared->user_data = "tuckpairstar";
+  tie->desugared->user_data = "tie";
+
+  return tie;
 }
 
 
 int main(int argc, char **argv) {
   mm__ = &system_allocator;
 
-  HParser *p = finkmaoTW();
+  HParser *p = finkmao();
   HCFGrammar *g = h_cfgrammar_(mm__, h_desugar_augmented(mm__, p));
   if (g == NULL) {
     fprintf(stderr, "h_cfgrammar failed\n");