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