]> ocean-lang.org Git - ocean/commitdiff
parsergen: report some tokens better when tracing.
authorNeilBrown <neilb@suse.de>
Thu, 25 Jul 2013 10:23:26 +0000 (20:23 +1000)
committerNeilBrown <neilb@suse.de>
Thu, 25 Jul 2013 10:29:13 +0000 (20:29 +1000)
Some tokens are best traced by giving their name rather
than their content.  e.g. newline.  So make a special
case of those.

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

index df217dd8777b16003cd8195445a6e27a934ef8b4..eac325584db3fc58a67d9b0a0f9ca5bb3af7961a 100644 (file)
@@ -2462,6 +2462,13 @@ end inside square brackets.
 
 ###### parser functions
 
+       static char *reserved_words[] = {
+               [TK_error]        = "ERROR",
+               [TK_in]           = "IN",
+               [TK_out]          = "OUT",
+               [TK_newline]      = "NEWLINE",
+               [TK_eof]          = "$eof",
+       };
        void parser_trace(FILE *trace, struct parser *p,
                          struct token *tk, const struct state states[],
                          const char *non_term[], int knowns)
@@ -2470,7 +2477,10 @@ end inside square brackets.
                for (i = 0; i < p->tos; i++) {
                        int sym = p->stack[i].sym;
                        fprintf(trace, "(%d) ", p->stack[i].state);
-                       if (sym < TK_reserved + knowns) {
+                       if (sym < TK_reserved &&
+                           reserved_words[sym] != NULL)
+                               fputs(reserved_words[sym], trace);
+                       else if (sym < TK_reserved + knowns) {
                                struct token *t = p->asn_stack[i];
                                text_dump(trace, t->txt, 20);
                        } else
@@ -2479,7 +2489,11 @@ end inside square brackets.
                        fputs(" ", trace);
                }
                fprintf(trace, "(%d) [", p->state);
-               text_dump(trace, tk->txt, 20);
+               if (tk->num < TK_reserved &&
+                   reserved_words[tk->num] != NULL)
+                       fputs(reserved_words[tk->num], trace);
+               else
+                       text_dump(trace, tk->txt, 20);
                fputs("]\n", trace);
        }