You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
2.9 KiB

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