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