decomp.c

    //remember to modify for <!...> and <?...>
    #include <stdio.h>
    #include <stdlib.h>

    #define DEBUG_PARSER 1
    #include "grammar.h"

    // Reconstitute grammar from tables.
    // Parsing code will be very similar, except recursing from PHRASE_BASE
    // rather than scanning sequentially from there.

    int main(int argc, char **argv)
    {
      int p, i, gp, alts;

      p = PHRASE_BASE;
      gp = 0;

      for (;;) { // All phrases in grammar, sequentially
        alts = gram[gp];
        fprintf(stdout, "\n//\\\\ P<%s> = ", phrasename[p-512]);
        gp++; // gp now points to first element (length) of first alt
        fflush(stdout);
        for (i = 0; i < alts; i++) {
          int each, phrases = gram[gp++];
          fprintf(stdout, "\n//\\\\   ");
          for (each = 0; each < phrases; each++) {
            int phrase = gram[gp];
            if (phrase < 256) {
              fprintf(stdout, " '%c'", phrase);
            } else if (phrase < 512) {
              fprintf(stdout, " \"%s\"", keyword[phrase-256]);
            } else if (phrase < 512+MAX_BIP) {
              fprintf(stdout, " <%s>", phrasename[phrase-512]);
            } else {
              fprintf(stdout, " <%s>", phrasename[phrase-512]);
            }
            gp++; // move over element
            fflush(stdout);
          }
          if (i+1 < alts) fprintf(stdout, ","); else fprintf(stdout, ";");
          // gp now points to first element (length) of next alt, or start of next phrase
        }
        p++;
        fprintf(stdout, "\n");
        if (p == (512+MAX_PHRASE)) break;
      }

      exit(0);
    }