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");