/Parser/printgrammar.c

http://unladen-swallow.googlecode.com/ · C · 117 lines · 100 code · 15 blank · 2 comment · 10 complexity · e628e1a016663bdd1735fbf51739fb83 MD5 · raw file

  1. /* Print a bunch of C initializers that represent a grammar */
  2. #include "pgenheaders.h"
  3. #include "grammar.h"
  4. /* Forward */
  5. static void printarcs(int, dfa *, FILE *);
  6. static void printstates(grammar *, FILE *);
  7. static void printdfas(grammar *, FILE *);
  8. static void printlabels(grammar *, FILE *);
  9. void
  10. printgrammar(grammar *g, FILE *fp)
  11. {
  12. fprintf(fp, "/* Generated by Parser/pgen */\n\n");
  13. fprintf(fp, "#include \"pgenheaders.h\"\n");
  14. fprintf(fp, "#include \"grammar.h\"\n");
  15. fprintf(fp, "PyAPI_DATA(grammar) _PyParser_Grammar;\n");
  16. printdfas(g, fp);
  17. printlabels(g, fp);
  18. fprintf(fp, "grammar _PyParser_Grammar = {\n");
  19. fprintf(fp, "\t%d,\n", g->g_ndfas);
  20. fprintf(fp, "\tdfas,\n");
  21. fprintf(fp, "\t{%d, labels},\n", g->g_ll.ll_nlabels);
  22. fprintf(fp, "\t%d\n", g->g_start);
  23. fprintf(fp, "};\n");
  24. }
  25. void
  26. printnonterminals(grammar *g, FILE *fp)
  27. {
  28. dfa *d;
  29. int i;
  30. fprintf(fp, "/* Generated by Parser/pgen */\n\n");
  31. d = g->g_dfa;
  32. for (i = g->g_ndfas; --i >= 0; d++)
  33. fprintf(fp, "#define %s %d\n", d->d_name, d->d_type);
  34. }
  35. static void
  36. printarcs(int i, dfa *d, FILE *fp)
  37. {
  38. arc *a;
  39. state *s;
  40. int j, k;
  41. s = d->d_state;
  42. for (j = 0; j < d->d_nstates; j++, s++) {
  43. fprintf(fp, "static arc arcs_%d_%d[%d] = {\n",
  44. i, j, s->s_narcs);
  45. a = s->s_arc;
  46. for (k = 0; k < s->s_narcs; k++, a++)
  47. fprintf(fp, "\t{%d, %d},\n", a->a_lbl, a->a_arrow);
  48. fprintf(fp, "};\n");
  49. }
  50. }
  51. static void
  52. printstates(grammar *g, FILE *fp)
  53. {
  54. state *s;
  55. dfa *d;
  56. int i, j;
  57. d = g->g_dfa;
  58. for (i = 0; i < g->g_ndfas; i++, d++) {
  59. printarcs(i, d, fp);
  60. fprintf(fp, "static state states_%d[%d] = {\n",
  61. i, d->d_nstates);
  62. s = d->d_state;
  63. for (j = 0; j < d->d_nstates; j++, s++)
  64. fprintf(fp, "\t{%d, arcs_%d_%d},\n",
  65. s->s_narcs, i, j);
  66. fprintf(fp, "};\n");
  67. }
  68. }
  69. static void
  70. printdfas(grammar *g, FILE *fp)
  71. {
  72. dfa *d;
  73. int i, j;
  74. printstates(g, fp);
  75. fprintf(fp, "static dfa dfas[%d] = {\n", g->g_ndfas);
  76. d = g->g_dfa;
  77. for (i = 0; i < g->g_ndfas; i++, d++) {
  78. fprintf(fp, "\t{%d, \"%s\", %d, %d, states_%d,\n",
  79. d->d_type, d->d_name, d->d_initial, d->d_nstates, i);
  80. fprintf(fp, "\t \"");
  81. for (j = 0; j < NBYTES(g->g_ll.ll_nlabels); j++)
  82. fprintf(fp, "\\%03o", d->d_first[j] & 0xff);
  83. fprintf(fp, "\"},\n");
  84. }
  85. fprintf(fp, "};\n");
  86. }
  87. static void
  88. printlabels(grammar *g, FILE *fp)
  89. {
  90. label *l;
  91. int i;
  92. fprintf(fp, "static label labels[%d] = {\n", g->g_ll.ll_nlabels);
  93. l = g->g_ll.ll_label;
  94. for (i = g->g_ll.ll_nlabels; --i >= 0; l++) {
  95. if (l->lb_str == NULL)
  96. fprintf(fp, "\t{%d, 0},\n", l->lb_type);
  97. else
  98. fprintf(fp, "\t{%d, \"%s\"},\n",
  99. l->lb_type, l->lb_str);
  100. }
  101. fprintf(fp, "};\n");
  102. }