From 748845ca0c6862d456d1e1ddd33d2c9e15d02338 Mon Sep 17 00:00:00 2001 From: "Sven M. Hallberg" <pesco@khjk.org> Date: Thu, 23 May 2013 23:35:10 +0200 Subject: [PATCH] add API for pretty-printing for grammar symbols and symbol sequences --- src/backends/llk.c | 9 +++------ src/cfgrammar.c | 23 ++++++++++++++--------- src/cfgrammar.h | 2 ++ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/backends/llk.c b/src/backends/llk.c index 69fb7efa..d414f8bd 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -164,9 +164,6 @@ static void stringmap_merge(HHashSet *workset, HCFStringMap *dst, HCFStringMap * } } -void pprint_sequence(FILE *f, const HCFGrammar *g, const HCFSequence *seq); -void pprint_symbol(FILE *f, const HCFGrammar *g, const HCFChoice *x); - /* Generate entries for the production "A" in the given table row. */ static int fill_table_row(size_t kmax, HCFGrammar *g, HCFStringMap *row, const HCFChoice *A) @@ -206,8 +203,8 @@ static int fill_table_row(size_t kmax, HCFGrammar *g, HCFStringMap *row, // XXX debug if(A == g->start) { printf("predict("); - pprint_sequence(stdout, g, rhs); - printf(" ) = "); + h_pprint_sequence(stdout, g, rhs); + printf(") = "); h_pprint_stringset(stdout, g, pred, 0); } } @@ -215,7 +212,7 @@ static int fill_table_row(size_t kmax, HCFGrammar *g, HCFStringMap *row, // XXX debug if(A == g->start) { printf("row("); - pprint_symbol(stdout, g, A); + h_pprint_symbol(stdout, g, A); printf(") = "); h_pprint_stringset(stdout, g, row, 0); } diff --git a/src/cfgrammar.c b/src/cfgrammar.c index 1721122e..2eb53d9d 100644 --- a/src/cfgrammar.c +++ b/src/cfgrammar.c @@ -624,7 +624,7 @@ static HCFChoice **pprint_string(FILE *f, HCFChoice **x) return x; } -void pprint_symbol(FILE *f, const HCFGrammar *g, const HCFChoice *x) +void h_pprint_symbol(FILE *f, const HCFGrammar *g, const HCFChoice *x) { switch(x->type) { case HCF_CHAR: @@ -643,32 +643,37 @@ void pprint_symbol(FILE *f, const HCFGrammar *g, const HCFChoice *x) } } -void pprint_sequence(FILE *f, const HCFGrammar *g, const HCFSequence *seq) +void h_pprint_sequence(FILE *f, const HCFGrammar *g, const HCFSequence *seq) { HCFChoice **x = seq->items; if(*x == NULL) { // the empty sequence - fputs(" \"\"", f); + fputs("\"\"", f); } else { while(*x) { - fputc(' ', f); // separator + if(x != seq->items) fputc(' ', f); // internal separator if((*x)->type == HCF_CHAR) { // condense character strings x = pprint_string(f, x); } else { - pprint_symbol(f, g, *x); + h_pprint_symbol(f, g, *x); x++; } } } +} +// adds some separators expected below +static void pprint_sequence(FILE *f, const HCFGrammar *g, const HCFSequence *seq) +{ + fputc(' ', f); + h_pprint_sequence(f, g, seq); fputc('\n', f); } -static -void pprint_ntrules(FILE *f, const HCFGrammar *g, const HCFChoice *nt, - int indent, int len) +static void pprint_ntrules(FILE *f, const HCFGrammar *g, const HCFChoice *nt, + int indent, int len) { int i; int column = indent + len; @@ -738,7 +743,7 @@ void h_pprint_symbolset(FILE *file, const HCFGrammar *g, const HHashSet *set, in a = hte->key; // production's left-hand symbol - pprint_symbol(file, g, a); + h_pprint_symbol(file, g, a); } } diff --git a/src/cfgrammar.h b/src/cfgrammar.h index 8dc4449a..5ac70b53 100644 --- a/src/cfgrammar.h +++ b/src/cfgrammar.h @@ -83,5 +83,7 @@ const HCFStringMap *h_follow(size_t k, HCFGrammar *g, const HCFChoice *x); /* Pretty-printers for grammars and associated data. */ void h_pprint_grammar(FILE *file, const HCFGrammar *g, int indent); +void h_pprint_sequence(FILE *f, const HCFGrammar *g, const HCFSequence *seq); +void h_pprint_symbol(FILE *f, const HCFGrammar *g, const HCFChoice *x); void h_pprint_symbolset(FILE *file, const HCFGrammar *g, const HHashSet *set, int indent); void h_pprint_stringset(FILE *file, const HCFGrammar *g, const HCFStringMap *set, int indent); -- GitLab