2 /* Parser generator main program */
4 /* This expects a filename containing the grammar as argv[1] (UNIX)
5 or asks the console for such a file name (THINK C).
6 It writes its output on two files in the current directory:
7 - "graminit.c" gets the grammar as a bunch of initialized data
8 - "graminit.h" gets the grammar's non-terminals as #defines.
9 Error messages and status info during the generation process are
10 written to stdout, or sometimes to stderr. */
13 - check for duplicate definitions of names (instead of fatal err)
16 #include "pgenheaders.h"
26 grammar
*getgrammar(char *filename
);
28 int main(int, char **);
39 main(int argc
, char **argv
)
49 fprintf(stderr
, "usage: %s grammar\n", argv
[0]);
54 g
= getgrammar(filename
);
55 fp
= fopen("graminit.c", "w");
60 printf("Writing graminit.c ...\n");
63 fp
= fopen("graminit.h", "w");
68 printf("Writing graminit.h ...\n");
69 printnonterminals(g
, fp
);
72 return 0; /* Make gcc -Wall happy */
76 getgrammar(char *filename
)
83 fp
= fopen(filename
, "r");
89 n
= PyParser_ParseFile(fp
, filename
, g0
, g0
->g_start
,
90 (char *)NULL
, (char *)NULL
, &err
);
93 fprintf(stderr
, "Parsing error %d, line %d.\n",
94 err
.error
, err
.lineno
);
95 if (err
.text
!= NULL
) {
97 fprintf(stderr
, "%s", err
.text
);
99 if (i
== 0 || err
.text
[i
-1] != '\n')
100 fprintf(stderr
, "\n");
101 for (i
= 0; i
< err
.offset
; i
++) {
102 if (err
.text
[i
] == '\t')
107 fprintf(stderr
, "^\n");
114 printf("Bad grammar.\n");
125 static char name
[256];
126 printf("Input file name: ");
127 if (fgets(buf
, sizeof buf
, stdin
) == NULL
) {
131 /* XXX The (unsigned char *) case is needed by THINK C 3.0 */
132 if (sscanf(/*(unsigned char *)*/buf
, " %s ", name
) != 1) {
141 Py_FatalError(char *msg
)
143 fprintf(stderr
, "pgen: FATAL ERROR: %s\n", msg
);
150 guesstabsize(char *path
)
156 /* No-nonsense my_readline() for tokenizer.c */
159 PyOS_Readline(char *prompt
)
162 char *p
= PyMem_MALLOC(n
);
166 fprintf(stderr
, "%s", prompt
);
167 q
= fgets(p
, n
, stdin
);
173 if (n
> 0 && p
[n
-1] != '\n')
175 return PyMem_REALLOC(p
, n
+1);
181 PySys_WriteStderr(const char *format
, ...)
185 va_start(va
, format
);
186 vfprintf(stderr
, format
, va
);