]> ocean-lang.org Git - ocean/commitdiff
parsergen: improve tracing of parse for line-oriented details.
authorNeilBrown <neilb@suse.de>
Sun, 4 May 2014 10:40:35 +0000 (20:40 +1000)
committerNeilBrown <neilb@suse.de>
Sun, 4 May 2014 10:40:35 +0000 (20:40 +1000)
Report if each state is known to start a line, and if each
frame permits a newline.

Signed-off-by: NeilBrown <neilb@suse.de>
csrc/parsergen.mdc

index 88c652a83d1de2df34350628a0594fd18091c3a0..6a6a316309df16aafc96ae62490d203bb4e11954 100644 (file)
@@ -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);