blob: 5d1d9e0a135bbe1e2e285ad2e83153c461d39548 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Print a bunch of C initializers that represent a grammar */
12
Guido van Rossum3f5da241990-12-20 15:06:42 +000013#include "pgenheaders.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014#include "grammar.h"
15
Guido van Rossum3f5da241990-12-20 15:06:42 +000016/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000017static void printarcs(int, dfa *, FILE *);
18static void printstates(grammar *, FILE *);
19static void printdfas(grammar *, FILE *);
20static void printlabels(grammar *, FILE *);
Guido van Rossum3f5da241990-12-20 15:06:42 +000021
22void
23printgrammar(g, fp)
24 grammar *g;
25 FILE *fp;
26{
27 fprintf(fp, "#include \"pgenheaders.h\"\n");
28 fprintf(fp, "#include \"grammar.h\"\n");
29 printdfas(g, fp);
30 printlabels(g, fp);
Guido van Rossumee2373b1997-05-07 23:51:07 +000031 fprintf(fp, "grammar _PyParser_Grammar = {\n");
Guido van Rossum3f5da241990-12-20 15:06:42 +000032 fprintf(fp, "\t%d,\n", g->g_ndfas);
33 fprintf(fp, "\tdfas,\n");
34 fprintf(fp, "\t{%d, labels},\n", g->g_ll.ll_nlabels);
35 fprintf(fp, "\t%d\n", g->g_start);
36 fprintf(fp, "};\n");
37}
38
39void
40printnonterminals(g, fp)
41 grammar *g;
42 FILE *fp;
43{
44 dfa *d;
45 int i;
46
47 d = g->g_dfa;
48 for (i = g->g_ndfas; --i >= 0; d++)
49 fprintf(fp, "#define %s %d\n", d->d_name, d->d_type);
50}
51
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052static void
53printarcs(i, d, fp)
54 int i;
55 dfa *d;
56 FILE *fp;
57{
58 arc *a;
59 state *s;
60 int j, k;
61
62 s = d->d_state;
63 for (j = 0; j < d->d_nstates; j++, s++) {
64 fprintf(fp, "static arc arcs_%d_%d[%d] = {\n",
65 i, j, s->s_narcs);
66 a = s->s_arc;
67 for (k = 0; k < s->s_narcs; k++, a++)
68 fprintf(fp, "\t{%d, %d},\n", a->a_lbl, a->a_arrow);
69 fprintf(fp, "};\n");
70 }
71}
72
73static void
74printstates(g, fp)
75 grammar *g;
76 FILE *fp;
77{
78 state *s;
79 dfa *d;
80 int i, j;
81
82 d = g->g_dfa;
83 for (i = 0; i < g->g_ndfas; i++, d++) {
84 printarcs(i, d, fp);
85 fprintf(fp, "static state states_%d[%d] = {\n",
86 i, d->d_nstates);
87 s = d->d_state;
88 for (j = 0; j < d->d_nstates; j++, s++)
89 fprintf(fp, "\t{%d, arcs_%d_%d},\n",
90 s->s_narcs, i, j);
91 fprintf(fp, "};\n");
92 }
93}
94
95static void
96printdfas(g, fp)
97 grammar *g;
98 FILE *fp;
99{
100 dfa *d;
101 int i, j;
102
103 printstates(g, fp);
104 fprintf(fp, "static dfa dfas[%d] = {\n", g->g_ndfas);
105 d = g->g_dfa;
106 for (i = 0; i < g->g_ndfas; i++, d++) {
107 fprintf(fp, "\t{%d, \"%s\", %d, %d, states_%d,\n",
108 d->d_type, d->d_name, d->d_initial, d->d_nstates, i);
109 fprintf(fp, "\t \"");
110 for (j = 0; j < NBYTES(g->g_ll.ll_nlabels); j++)
111 fprintf(fp, "\\%03o", d->d_first[j] & 0xff);
112 fprintf(fp, "\"},\n");
113 }
114 fprintf(fp, "};\n");
115}
116
117static void
118printlabels(g, fp)
119 grammar *g;
120 FILE *fp;
121{
122 label *l;
123 int i;
124
125 fprintf(fp, "static label labels[%d] = {\n", g->g_ll.ll_nlabels);
126 l = g->g_ll.ll_label;
127 for (i = g->g_ll.ll_nlabels; --i >= 0; l++) {
128 if (l->lb_str == NULL)
129 fprintf(fp, "\t{%d, 0},\n", l->lb_type);
130 else
131 fprintf(fp, "\t{%d, \"%s\"},\n",
132 l->lb_type, l->lb_str);
133 }
134 fprintf(fp, "};\n");
135}