-#include "state.h"
-
-
-extern int debugflag;
-extern int nolinesflag;
-extern int noparserflag;
-extern int toknumflag;
-
-extern char **tags;
-extern int *user_toknums;
-extern int tokensetsize;
-extern int final_state;
-extern core **state_table;
-extern shifts **shift_table;
-extern errs **err_table;
-extern reductions **reduction_table;
-extern short *accessing_symbol;
-extern unsigned *LA;
-extern short *LAruleno;
-extern short *lookaheads;
-extern char *consistent;
-extern short *goto_map;
-extern short *from_state;
-extern short *to_state;
-extern int lineno;
-
-void output_headers PARAMS((void));
-void output_trailers PARAMS((void));
-void output PARAMS((void));
-void output_token_translations PARAMS((void));
-void output_gram PARAMS((void));
-void output_stos PARAMS((void));
-void output_rule_data PARAMS((void));
-void output_defines PARAMS((void));
-void output_actions PARAMS((void));
-void token_actions PARAMS((void));
-void save_row PARAMS((int));
-void goto_actions PARAMS((void));
-void save_column PARAMS((int, int));
-void sort_actions PARAMS((void));
-void pack_table PARAMS((void));
-void output_base PARAMS((void));
-void output_table PARAMS((void));
-void output_check PARAMS((void));
-void output_parser PARAMS((void));
-void output_program PARAMS((void));
-void free_shifts PARAMS((void));
-void free_reductions PARAMS((void));
-void free_itemsets PARAMS((void));
-int action_row PARAMS((int));
-int default_goto PARAMS((int));
-int matching_state PARAMS((int));
-int pack_vector PARAMS((int));
-
-extern void berror PARAMS((char *));
-extern void fatals PARAMS((char *, char *));
-extern char *int_to_string PARAMS((int));
-extern void reader_output_yylsp PARAMS((FILE *));
-
-static int nvectors;
-static int nentries;
-static short **froms;
-static short **tos;
-static short *tally;
-static short *width;
-static short *actrow;
-static short *state_count;
-static short *order;
-static short *base;
-static short *pos;
-static short *table;
-static short *check;
-static int lowzero;
-static int high;
-
-
-
-#define GUARDSTR "\n#include \"%s\"\nextern int yyerror;\n\
-extern int yycost;\nextern char * yymsg;\nextern YYSTYPE yyval;\n\n\
-yyguard(n, yyvsp, yylsp)\nregister int n;\nregister YYSTYPE *yyvsp;\n\
-register YYLTYPE *yylsp;\n\
-{\n yyerror = 0;\nyycost = 0;\n yymsg = 0;\nswitch (n)\n {"
-
-#define ACTSTR "\n#include \"%s\"\nextern YYSTYPE yyval;\
-\nextern int yychar;\
-yyaction(n, yyvsp, yylsp)\nregister int n;\nregister YYSTYPE *yyvsp;\n\
-register YYLTYPE *yylsp;\n{\n switch (n)\n{"
-
-#define ACTSTR_SIMPLE "\n switch (yyn) {\n"
-
-
-void
-output_headers (void)
-{
- if (semantic_parser)
- fprintf(fguard, GUARDSTR, attrsfile);
-
- if (noparserflag)
- return;
-
- fprintf(faction, (semantic_parser ? ACTSTR : ACTSTR_SIMPLE), attrsfile);
-/* if (semantic_parser) JF moved this below
- fprintf(ftable, "#include \"%s\"\n", attrsfile);
- fprintf(ftable, "#include <stdio.h>\n\n");
-*/
-
- /* Rename certain symbols if -p was specified. */
- if (spec_name_prefix)
- {
- fprintf(ftable, "#define yyparse %sparse\n", spec_name_prefix);
- fprintf(ftable, "#define yylex %slex\n", spec_name_prefix);
- fprintf(ftable, "#define yyerror %serror\n", spec_name_prefix);
- fprintf(ftable, "#define yylval %slval\n", spec_name_prefix);
- fprintf(ftable, "#define yychar %schar\n", spec_name_prefix);
- fprintf(ftable, "#define yydebug %sdebug\n", spec_name_prefix);
- fprintf(ftable, "#define yynerrs %snerrs\n", spec_name_prefix);
- }
-}
-
-
-void
-output_trailers (void)
-{
- if (semantic_parser)
- fprintf(fguard, "\n }\n}\n");
-
- fprintf(faction, "\n");
-
- if (noparserflag)
- return;
-
- if (semantic_parser)
- fprintf(faction, " }\n");
- fprintf(faction, "}\n");
-}
-
-
-void
-output (void)
-{
- int c;
-
- /* output_token_defines(ftable); / * JF put out token defines FIRST */
- if (!semantic_parser) /* JF Put out other stuff */
- {
- rewind(fattrs);
- while ((c=getc(fattrs))!=EOF)
- putc(c,ftable);
- }
- reader_output_yylsp(ftable);
- if (debugflag)
- fprintf(ftable, "#ifndef YYDEBUG\n#define YYDEBUG %d\n#endif\n\n",
- !!debugflag);
-
- if (semantic_parser)
- fprintf(ftable, "#include \"%s\"\n", attrsfile);
-
- if (! noparserflag)
- fprintf(ftable, "#include <stdio.h>\n\n");
-
- /* Make "const" do nothing if not in ANSI C. */
- fprintf (ftable, "#ifndef __cplusplus\n#ifndef __STDC__\n#define const\n#endif\n#endif\n\n");
-
- free_itemsets();
- output_defines();
- output_token_translations();
-/* if (semantic_parser) */
- /* This is now unconditional because debugging printouts can use it. */
- output_gram();
- FREE(ritem);
- if (semantic_parser)
- output_stos();
- output_rule_data();
- output_actions();
- if (! noparserflag)
- output_parser();
- output_program();
+#include "muscle-tab.h"
+#include "output.h"
+#include "reader.h"
+#include "scan-code.h" /* max_left_semantic_context */
+#include "scan-skel.h"
+#include "symtab.h"
+#include "tables.h"
+
+# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
+
+static struct obstack format_obstack;
+
+
+/*-------------------------------------------------------------------.
+| Create a function NAME which associates to the muscle NAME the |
+| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
+| TYPE), and to the muscle NAME_max, the max value of the |
+| TABLE_DATA. |
+`-------------------------------------------------------------------*/
+
+
+#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
+ \
+static void \
+Name (char const *name, \
+ Type *table_data, \
+ Type first, \
+ int begin, \
+ int end) \
+{ \
+ Type min = first; \
+ Type max = first; \
+ long int lmin; \
+ long int lmax; \
+ int i; \
+ int j = 1; \
+ \
+ obstack_fgrow1 (&format_obstack, "%6d", first); \
+ for (i = begin; i < end; ++i) \
+ { \
+ obstack_1grow (&format_obstack, ','); \
+ if (j >= 10) \
+ { \
+ obstack_sgrow (&format_obstack, "\n "); \
+ j = 1; \
+ } \
+ else \
+ ++j; \
+ obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
+ if (table_data[i] < min) \
+ min = table_data[i]; \
+ if (max < table_data[i]) \
+ max = table_data[i]; \
+ } \
+ obstack_1grow (&format_obstack, 0); \
+ muscle_insert (name, obstack_finish (&format_obstack)); \
+ \
+ lmin = min; \
+ lmax = max; \
+ /* Build `NAME_min' and `NAME_max' in the obstack. */ \
+ obstack_fgrow1 (&format_obstack, "%s_min", name); \
+ obstack_1grow (&format_obstack, 0); \
+ MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \
+ obstack_fgrow1 (&format_obstack, "%s_max", name); \
+ obstack_1grow (&format_obstack, 0); \
+ MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax); \