char rcsid_be[] = "$Id$";
#include <stdio.h>
#include <string.h>
#include "b.h"
#include "fe.h"
#define ERROR_VAL 0
FILE *outfile;
const char *prefix = "burm";
static void doKids ARGS((RuleAST));
static void doLabel ARGS((Operator));
static void doLayout ARGS((RuleAST));
static void doMakeTable ARGS((Operator));
static void doVector ARGS((RuleAST));
static void layoutNts ARGS((PatternAST));
static void makeIndex_Map ARGS((Dimension));
static void makePvector ARGS((void));
static void makeState ARGS((void));
static void printPatternAST ARGS((PatternAST));
static void printPatternAST_int ARGS((PatternAST));
static void setVectors ARGS((PatternAST));
static void trailing_zeroes ARGS((int));
static int seminal ARGS((int from, int to));
static void printRule ARGS((RuleAST, const char *));
static void
doLabel(op) Operator op;
{
fprintf(outfile, "\tcase %d:\n", op->num);
switch (op->arity) {
default:
assert(0);
break;
case 0:
fprintf(outfile, "\t\treturn %d;\n", op->table->transition[0]->num);
break;
case 1:
if (op->table->rules) {
fprintf(outfile, "\t\treturn %s_%s_transition[l];\n", prefix, op->name);
} else {
fprintf(outfile, "\t\treturn %d;\n", ERROR_VAL);
}
break;
case 2:
if (op->table->rules) {
fprintf(outfile, "\t\treturn %s_%s_transition[%s_%s_imap_1[l]][%s_%s_imap_2[r]];\n", prefix, op->name, prefix, op->name, prefix, op->name);
} else {
fprintf(outfile, "\t\treturn %d;\n", ERROR_VAL);
}
break;
}
}
int
opsOfArity(arity) int arity;
{
int c;
List l;
c = 0;
for (l = operators; l; l = l->next) {
Operator op = (Operator) l->x;
if (op->arity == arity) {
fprintf(outfile, "\tcase %d:\n", op->num);
c++;
}
}
return c;
}
static void
trailing_zeroes(z) int z;
{
int i;
for (i = 0; i < z; i++) {
fprintf(outfile, ", 0");
}
}
void
makeLabel()
{
int flag;
fprintf(outfile, "#ifdef __STDC__\n");
fprintf(outfile, "int %s_label(%s_NODEPTR_TYPE n) {\n", prefix, prefix);
fprintf(outfile, "#else\n");
fprintf(outfile, "int %s_label(n) %s_NODEPTR_TYPE n; {\n", prefix, prefix);
fprintf(outfile, "#endif\n");
fprintf(outfile,
"\t%s_assert(n, %s_PANIC(\"NULL pointer passed to %s_label\\n\"));\n",
prefix, prefix, prefix);
fprintf(outfile, "\tswitch (%s_OP_LABEL(n)) {\n", prefix);
fprintf(outfile, "\tdefault: %s_PANIC(\"Bad op %%d in %s_label\\n\", %s_OP_LABEL(n)); abort(); return 0;\n",
prefix, prefix, prefix);
flag = opsOfArity(0);
<