From: NeilBrown Date: Sun, 4 May 2014 10:40:35 +0000 (+1000) Subject: parsergen: improve tracing of parse for line-oriented details. X-Git-Tag: linebreakparser~1 X-Git-Url: https://ocean-lang.org/code/?p=ocean;a=commitdiff_plain;h=789710a792984af0f57722694ac9e105108cc15a parsergen: improve tracing of parse for line-oriented details. Report if each state is known to start a line, and if each frame permits a newline. Signed-off-by: NeilBrown --- diff --git a/csrc/parsergen.mdc b/csrc/parsergen.mdc index 88c652a..6a6a316 100644 --- a/csrc/parsergen.mdc +++ b/csrc/parsergen.mdc @@ -2644,6 +2644,19 @@ end inside square brackets. [TK_newline] = "NEWLINE", [TK_eof] = "$eof", }; + static void parser_trace_state(FILE *trace, struct frame *f, const struct state states[]) + { + fprintf(trace, "(%d", f->state); + if (f->indents) + fprintf(trace, "%c%d", f->starts_indented?':':'.', + f->indents); + if (states[f->state].starts_line) + fprintf(trace, "s"); + if (f->newline_permitted) + fprintf(trace, "n"); + fprintf(trace, ") "); + } + void parser_trace(FILE *trace, struct parser *p, struct token *tk, const struct state states[], const char *non_term[], int knowns) @@ -2651,7 +2664,7 @@ end inside square brackets. int i; for (i = 0; i < p->tos; i++) { int sym = p->stack[i].sym; - fprintf(trace, "(%d) ", p->stack[i].state); + parser_trace_state(trace, &p->stack[i], states); if (sym < TK_reserved && reserved_words[sym] != NULL) fputs(reserved_words[sym], trace); @@ -2663,7 +2676,8 @@ end inside square brackets. trace); fputs(" ", trace); } - fprintf(trace, "(%d) [", p->next.state); + parser_trace_state(trace, &p->next, states); + fprintf(trace, " ["); if (tk->num < TK_reserved && reserved_words[tk->num] != NULL) fputs(reserved_words[tk->num], trace);