add pretty printers for symbol and token sets
This commit is contained in:
parent
cd4ce77bec
commit
d0eb2ce891
1 changed files with 69 additions and 0 deletions
|
|
@ -394,6 +394,22 @@ static HCFChoice **pprint_string(FILE *f, HCFChoice **x)
|
|||
return x;
|
||||
}
|
||||
|
||||
static void pprint_symbol(FILE *f, const HCFGrammar *g, const HCFChoice *x)
|
||||
{
|
||||
switch(x->type) {
|
||||
case HCF_CHAR:
|
||||
fputc('"', f);
|
||||
pprint_char(f, x->chr);
|
||||
fputc('"', f);
|
||||
break;
|
||||
case HCF_END:
|
||||
fputc('$', f);
|
||||
break;
|
||||
default:
|
||||
fputs(nonterminal_name(g, x), f);
|
||||
}
|
||||
}
|
||||
|
||||
static void pprint_sequence(FILE *f, const HCFGrammar *g, const HCFSequence *seq)
|
||||
{
|
||||
HCFChoice **x = seq->items;
|
||||
|
|
@ -478,6 +494,59 @@ void h_pprint_grammar(FILE *file, const HCFGrammar *g, int indent)
|
|||
}
|
||||
}
|
||||
|
||||
void h_pprint_symbolset(FILE *file, const HCFGrammar *g, const HHashSet *set, int indent)
|
||||
{
|
||||
int j;
|
||||
for(j=0; j<indent; j++) fputc(' ', file);
|
||||
|
||||
fputc('{', file);
|
||||
|
||||
// iterate over set
|
||||
size_t i;
|
||||
HHashTableEntry *hte;
|
||||
for(i=0; i < set->capacity; i++) {
|
||||
for(hte = &set->contents[i]; hte; hte = hte->next) {
|
||||
if(hte->key == NULL)
|
||||
continue;
|
||||
const HCFChoice *a = hte->key; // production's left-hand symbol
|
||||
|
||||
pprint_symbol(file, g, a);
|
||||
fputc(',', file);
|
||||
}
|
||||
}
|
||||
|
||||
fputs("}\n", file);
|
||||
}
|
||||
|
||||
void h_pprint_tokenset(FILE *file, const HCFGrammar *g, const HHashSet *set, int indent)
|
||||
{
|
||||
int j;
|
||||
for(j=0; j<indent; j++) fputc(' ', file);
|
||||
|
||||
fputc('[', file);
|
||||
|
||||
// iterate over set
|
||||
size_t i;
|
||||
HHashTableEntry *hte;
|
||||
for(i=0; i < set->capacity; i++) {
|
||||
for(hte = &set->contents[i]; hte; hte = hte->next) {
|
||||
if(hte->key == NULL)
|
||||
continue;
|
||||
HCFTerminal a = (intptr_t)hte->key;
|
||||
// BUG this ignores tokens with value 0!
|
||||
|
||||
if(a == '$')
|
||||
fputs("\\$", file);
|
||||
else if(a == end_token)
|
||||
fputc('$', file);
|
||||
else
|
||||
pprint_char(file, a);
|
||||
}
|
||||
}
|
||||
|
||||
fputs("]\n", file);
|
||||
}
|
||||
|
||||
|
||||
/* LL parse table and associated data */
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue