Move support/lib into lib/Support
[oota-llvm.git] / support / tools / Burg / plank.c
diff --git a/support/tools/Burg/plank.c b/support/tools/Burg/plank.c
deleted file mode 100644 (file)
index 1ce006d..0000000
+++ /dev/null
@@ -1,921 +0,0 @@
-char rcsid_plank[] = "$Id$";
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include "b.h"
-#include "fe.h"
-
-#define ERROR_VAL 0
-
-int speedflag = 0;
-
-Item_Set *sortedStates;
-static struct stateMapTable smt;
-int exceptionTolerance = 0;
-static int plankSize = 32;
-
-static Plank newPlank ARGS((void));
-static PlankMap newPlankMap ARGS((int));
-static StateMap newStateMap ARGS((void));
-static Exception newException ARGS((int, int));
-static void enterStateMap ARGS((PlankMap, short *, int, int *));
-static List assemblePlanks ARGS((void));
-static void assignRules ARGS((RuleAST));
-static int stateCompare ARGS((Item_Set *, Item_Set *));
-static int ruleCompare ARGS((RuleAST *, RuleAST *));
-static void renumber ARGS((void));
-static short * newVector ARGS((void));
-static int width ARGS((int));
-static PlankMap mapToPmap ARGS((Dimension));
-static void doDimPmaps ARGS((Operator));
-static void doNonTermPmaps ARGS((NonTerminal));
-static void makePmaps ARGS((void));
-static void outPlank ARGS((Plank));
-static void purgePlanks ARGS((List));
-static void inToEx ARGS((void));
-static void makePlankRuleMacros ARGS((void));
-static void makePlankRule ARGS((void));
-static void exceptionSwitch ARGS((List, const char *, const char *, const char *, int, const char *));
-static void doPlankLabel ARGS((Operator));
-static void doPlankLabelSafely ARGS((Operator));
-static void doPlankLabelMacrosSafely ARGS((Operator));
-static void makePlankState ARGS((void));
-
-static Plank
-newPlank()
-{
-       Plank p;
-       char buf[50];
-       static int num = 0;
-
-       p = (Plank) zalloc(sizeof(struct plank));
-       sprintf(buf, "%s_plank_%d", prefix, num++);
-       p->name = (char *) zalloc(strlen(buf)+1);
-       strcpy(p->name, buf);
-       return p;
-}
-
-static PlankMap
-newPlankMap(offset) int offset;
-{
-       PlankMap im;
-
-       im = (PlankMap) zalloc(sizeof(struct plankMap));
-       im->offset = offset;
-       return im;
-}
-
-static StateMap
-newStateMap()
-{
-       char buf[50];
-       static int num = 0;
-
-       StateMap sm;
-
-       sm = (StateMap) zalloc(sizeof(struct stateMap));
-       sprintf(buf, "f%d", num++);
-       sm->fieldname = (char *) zalloc(strlen(buf)+1);
-       strcpy(sm->fieldname, buf);
-       return sm;
-}
-
-static Exception
-newException(index, value) int index; int value;
-{
-       Exception e;
-
-       e = (Exception) zalloc(sizeof(struct except));
-       e->index = index;
-       e->value = value;
-       return e;
-}
-
-static void
-enterStateMap(im, v, width, new) PlankMap im; short * v; int width; int *new;
-{
-       int i;
-       StateMap sm;
-       List l;
-       int size;
-
-       assert(im);
-       assert(v);
-       assert(width > 0);
-       size = globalMap->count;
-
-       for (l = smt.maps; l; l = l->next) {
-               int ecount;
-
-               sm = (StateMap) l->x;
-               ecount = 0;
-               for (i = 0; i < size; i++) {
-                       if (v[i] != -1 && sm->value[i] != -1 && v[i] != sm->value[i]) {
-                               if (++ecount > exceptionTolerance) {
-                                       goto again;
-                               }
-                       }
-               }
-               for (i = 0; i < size; i++) {
-                       assert(v[i] >= 0);
-                       assert(sm->value[i] >= 0);
-                       if (v[i] == -1) {
-                               continue;
-                       }
-                       if (sm->value[i] == -1) {
-                               sm->value[i] = v[i];
-                       } else if (v[i] != sm->value[i]) {
-                               im->exceptions = newList(newException(i,v[i]), im->exceptions);
-                       }
-               }
-               im->values = sm;
-               if (width > sm->width) {
-                       sm->width = width;
-               }
-               *new = 0;
-               return;
-       again: ;
-       }
-       sm = newStateMap();
-       im->values = sm;
-       sm->value = v;
-       sm->width = width;
-       *new = 1;
-       smt.maps = newList(sm, smt.maps);
-}
-
-static List
-assemblePlanks()
-{
-       List planks = 0;
-       Plank pl;
-       List p;
-       List s;
-
-       for (s = smt.maps; s; s = s->next) {
-               StateMap sm = (StateMap) s->x;
-               for (p = planks; p; p = p->next) {
-                       pl = (Plank) p->x;
-                       if (sm->width <= plankSize - pl->width) {
-                               pl->width += sm->width;
-                               pl->fields = newList(sm, pl->fields);
-                               sm->plank = pl;
-                               goto next;
-                       }
-               }
-               pl = newPlank();
-               pl->width = sm->width;
-               pl->fields = newList(sm, 0);
-               sm->plank = pl;
-               planks = appendList(pl, planks);
-       next: ;
-       }
-       return planks;
-}
-
-RuleAST *sortedRules;
-
-static int count;
-
-static void
-assignRules(ast) RuleAST ast;
-{
-       sortedRules[count++] = ast;
-}
-
-static int
-stateCompare(s, t) Item_Set *s; Item_Set *t;
-{
-       return strcmp((*s)->op->name, (*t)->op->name);
-}
-
-static int
-ruleCompare(s, t) RuleAST *s; RuleAST *t;
-{
-       return strcmp((*s)->lhs, (*t)->lhs);
-}
-
-void
-dumpSortedStates()
-{
-       int i;
-       
-       printf("dump Sorted States: ");
-       for (i = 0; i < globalMap->count; i++) {
-               printf("%d ", sortedStates[i]->num);
-       }
-       printf("\n");
-}
-
-void
-dumpSortedRules()
-{
-       int i;
-       
-       printf("dump Sorted Rules: ");
-       for (i = 0; i < max_ruleAST; i++) {
-               printf("%d ", sortedRules[i]->rule->erulenum);
-       }
-       printf("\n");
-}
-
-static void
-renumber()
-{
-       int i;
-       Operator previousOp;
-       NonTerminal previousLHS;
-       int base_counter;
-
-       sortedStates = (Item_Set*) zalloc(globalMap->count * sizeof(Item_Set));
-       for (i = 1; i < globalMap->count; i++) {
-               sortedStates[i-1] = globalMap->set[i];
-       }
-       qsort(sortedStates, globalMap->count-1, sizeof(Item_Set), (int(*)(const void *, const void *))stateCompare);
-       previousOp = 0;
-       for (i = 0; i < globalMap->count-1; i++) {
-               sortedStates[i]->newNum = i;
-               sortedStates[i]->op->stateCount++;
-               if (previousOp != sortedStates[i]->op) {
-                       sortedStates[i]->op->baseNum = i;
-                       previousOp = sortedStates[i]->op;
-               }
-       }
-
-       sortedRules = (RuleAST*) zalloc(max_ruleAST * sizeof(RuleAST));
-       count = 0;
-       foreachList((ListFn) assignRules, ruleASTs);
-       qsort(sortedRules, max_ruleAST, sizeof(RuleAST), (int(*)(const void *, const void *))ruleCompare);
-       previousLHS = 0;
-       base_counter = 0;
-       for (i = 0; i < max_ruleAST; i++) {
-               if (previousLHS != sortedRules[i]->rule->lhs) {
-                       sortedRules[i]->rule->lhs->baseNum = base_counter;
-                       previousLHS = sortedRules[i]->rule->lhs;
-                       base_counter++; /* make space for 0 */
-               }
-               sortedRules[i]->rule->newNum = base_counter;
-               sortedRules[i]->rule->lhs->ruleCount++;
-               sortedRules[i]->rule->lhs->sampleRule = sortedRules[i]->rule; /* kludge for diagnostics */
-               base_counter++;
-       }
-}
-
-static short *
-newVector()
-{
-       short *p;
-       p = (short *) zalloc(globalMap->count* sizeof(short));
-       return p;
-}
-
-static int
-width(v) int v;
-{
-       int c;
-
-       for (c = 0; v; v >>= 1) {
-               c++;
-       }
-       return c;
-
-}
-
-static PlankMap
-mapToPmap(d) Dimension d;
-{
-       PlankMap im;
-       short *v;
-       int i;
-       int new;
-
-       if (d->map->count == 1) {
-               return 0;
-       }
-       assert(d->map->count > 1);
-       im = newPlankMap(0);
-       v = newVector();
-       for (i = 0; i < globalMap->count-1; i++) {
-               int index = d->map->set[d->index_map.class[sortedStates[i]->num]->num]->num;
-               assert(index >= 0);
-               v[i+1] = index;
-       }
-       v[0] = 0;
-       enterStateMap(im, v, width(d->map->count), &new);
-       if (!new) {
-               zfree(v);
-       }
-       return im;
-}
-
-static void
-doDimPmaps(op) Operator op;
-{
-       int i, j;
-       Dimension d;
-       short *v;
-       PlankMap im;
-       int new;
-
-       if (!op->table->rules) {
-               return;
-       }
-       switch (op->arity) {
-       case 0:
-               break;
-       case 1:
-               d = op->table->dimen[0];
-               if (d->map->count > 1) {
-                       v = newVector();
-                       im = newPlankMap(op->baseNum);
-                       for (i = 0; i < globalMap->count-1; i++) {
-                               int index = d->map->set[d->index_map.class[sortedStates[i]->num]->num]->num;
-                               if (index) {
-                                       Item_Set *ts = transLval(op->table, index, 0);
-                                       v[i+1] = (*ts)->newNum - op->baseNum+1;
-                                       assert(v[i+1] >= 0);
-                               }
-                       }
-                       enterStateMap(im, v, width(d->map->count-1), &new);
-                       if (!new) {
-                               zfree(v);
-                       }
-                       d->pmap = im;
-               }
-               break;
-       case 2:
-               if (op->table->dimen[0]->map->count == 1 && op->table->dimen[1]->map->count == 1) {
-                       op->table->dimen[0]->pmap = 0;
-                       op->table->dimen[1]->pmap = 0;
-               } else if (op->table->dimen[0]->map->count == 1) {
-                       v = newVector();
-                       im = newPlankMap(op->baseNum);
-                       d = op->table->dimen[1];
-                       for (i = 0; i < globalMap->count-1; i++) {
-                               int index = d->map->set[d->index_map.class[sortedStates[i]->num]->num]->num;
-                               if (index) {
-                                       Item_Set *ts = transLval(op->table, 1, index);
-                                       v[i+1] = (*ts)->newNum - op->baseNum+1;
-                                       assert(v[i+1] >= 0);
-                               }
-                       }
-                       enterStateMap(im, v, width(d->map->count-1), &new);
-                       if (!new) {
-                               zfree(v);
-                       }
-                       d->pmap = im;
-               } else if (op->table->dimen[1]->map->count == 1) {
-                       v = newVector();
-                       im = newPlankMap(op->baseNum);
-                       d = op->table->dimen[0];
-                       for (i = 0; i < globalMap->count-1; i++) {
-                               int index = d->map->set[d->index_map.class[sortedStates[i]->num]->num]->num;
-                               if (index) {
-                                       Item_Set *ts = transLval(op->table, index, 1);
-                                       v[i +1] = (*ts)->newNum - op->baseNum +1;
-                                       assert(v[i +1] >= 0);
-                               }
-                       }
-                       enterStateMap(im, v, width(d->map->count-1), &new);
-                       if (!new) {
-                               zfree(v);
-                       }
-                       d->pmap = im;
-               } else {
-                       op->table->dimen[0]->pmap = mapToPmap(op->table->dimen[0]);
-                       op->table->dimen[1]->pmap = mapToPmap(op->table->dimen[1]);
-                       /* output table */
-                       fprintf(outfile, "static unsigned %s %s_%s_transition[%d][%d] = {", 
-                               op->stateCount <= 255 ? "char" : "short",
-                               prefix,
-                               op->name,
-                               op->table->dimen[0]->map->count,
-                               op->table->dimen[1]->map->count);
-                       for (i = 0; i < op->table->dimen[0]->map->count; i++) {
-                               if (i > 0) {
-                                       fprintf(outfile, ",");
-                               }
-                               fprintf(outfile, "\n{");
-                               for (j = 0; j < op->table->dimen[1]->map->count; j++) {
-                                       Item_Set *ts = transLval(op->table, i, j);
-                                       short diff;
-                                       if (j > 0) {
-                                               fprintf(outfile, ",");
-                                               if (j % 10 == 0) {
-                                                       fprintf(outfile, "\t/* row %d, cols %d-%d*/\n",
-                                                               i,
-                                                               j-10,
-                                                               j-1);
-                                               }
-                                       }
-                                       if ((*ts)->num > 0) {
-                                               diff = (*ts)->newNum - op->baseNum +1;
-                                       } else {
-                                               diff = 0;
-                                       }
-                                       fprintf(outfile, "%5d", diff);
-                               }
-                               fprintf(outfile, "}\t/* row %d */", i);
-                       }
-                       fprintf(outfile, "\n};\n");
-               }
-               break;
-       default:
-               assert(0);
-       }
-}
-
-static NonTerminal *ntVector;
-
-static void
-doNonTermPmaps(n) NonTerminal n;
-{
-       short *v;
-       PlankMap im;
-       int new;
-       int i;
-
-       ntVector[n->num] = n;
-       if (n->num >= last_user_nonterminal) {
-               return;
-       }
-       if (n->ruleCount <= 0) {
-               return;
-       }
-       im = newPlankMap(n->baseNum);
-       v = newVector();
-       for (i = 0; i < globalMap->count-1; i++) {
-               Rule r = globalMap->set[sortedStates[i]->num]->closed[n->num].rule;
-               if (r) {
-                       r->used = 1;
-                       v[i+1] = r->newNum - n->baseNum /*safely*/;
-                       assert(v[i+1] >= 0);
-               }
-       }
-       enterStateMap(im, v, width(n->ruleCount+1), &new);
-       if (!new) {
-               zfree(v);
-       }
-       n->pmap = im;
-}
-
-static void
-makePmaps()
-{
-       foreachList((ListFn) doDimPmaps, operators);
-       ntVector = (NonTerminal*) zalloc((max_nonterminal) * sizeof(NonTerminal));
-       foreachList((ListFn) doNonTermPmaps, nonterminals);
-}
-
-static void
-outPlank(p) Plank p;
-{
-       List f;
-       int i;
-
-       fprintf(outfile, "static struct {\n");
-
-       for (f = p->fields; f; f = f->next) {
-               StateMap sm = (StateMap) f->x;
-               fprintf(outfile, "\tunsigned int %s:%d;\n", sm->fieldname, sm->width);
-       }
-
-       fprintf(outfile, "} %s[] = {\n", p->name);
-
-       for (i = 0; i < globalMap->count; i++) {
-               fprintf(outfile, "\t{");
-               for (f = p->fields; f; f = f->next) {
-                       StateMap sm = (StateMap) f->x;
-                       fprintf(outfile, "%4d,", sm->value[i] == -1 ? ERROR_VAL : sm->value[i]);
-               }
-               fprintf(outfile, "},\t/* row %d */\n", i);
-       }
-
-       fprintf(outfile, "};\n");
-}
-
-static void
-purgePlanks(planks) List planks;
-{
-       List p;
-
-       for (p = planks; p; p = p->next) {
-               Plank x = (Plank) p->x;
-               outPlank(x);
-       }
-}
-
-static void
-inToEx()
-{
-       int i;
-       int counter;
-
-       fprintf(outfile, "static short %s_eruleMap[] = {\n", prefix);
-       counter = 0;
-       for (i = 0; i < max_ruleAST; i++) {
-               if (counter > 0) {
-                       fprintf(outfile, ",");
-                       if (counter % 10 == 0) {
-                               fprintf(outfile, "\t/* %d-%d */\n", counter-10, counter-1);
-                       }
-               }
-               if (counter < sortedRules[i]->rule->newNum) {
-                       assert(counter == sortedRules[i]->rule->newNum-1);
-                       fprintf(outfile, "%5d", 0);
-                       counter++;
-                       if (counter > 0) {
-                               fprintf(outfile, ",");
-                               if (counter % 10 == 0) {
-                                       fprintf(outfile, "\t/* %d-%d */\n", counter-10, counter-1);
-                               }
-                       }
-               }
-               fprintf(outfile, "%5d", sortedRules[i]->rule->erulenum);
-               counter++;
-       }
-       fprintf(outfile, "\n};\n");
-}
-
-static void
-makePlankRuleMacros()
-{
-       int i;
-
-       for (i = 1; i < last_user_nonterminal; i++) {
-               List es;
-               PlankMap im = ntVector[i]->pmap;
-               fprintf(outfile, "#define %s_%s_rule(state)\t", prefix, ntVector[i]->name);
-               if (im) {
-                       fprintf(outfile, "%s_eruleMap[", prefix);
-                       for (es = im->exceptions; es; es = es->next) {
-                               Exception e = (Exception) es->x;
-                               fprintf(outfile, "((state) == %d ? %d :", 
-                                               e->index, e->value);
-                       }
-                       fprintf(outfile, "%s[state].%s", 
-                               im->values->plank->name, 
-                               im->values->fieldname);
-                       for (es = im->exceptions; es; es = es->next) {
-                               fprintf(outfile, ")");
-                       }
-                       fprintf(outfile, " +%d]", im->offset);
-
-               } else {
-                       /* nonterminal never appears on LHS. */
-                       assert(ntVector[i] ==  start);
-                       fprintf(outfile, "0");
-               }
-               fprintf(outfile, "\n");
-       }
-       fprintf(outfile, "\n");
-}
-
-static void
-makePlankRule()
-{
-       int i;
-
-       makePlankRuleMacros();
-
-       fprintf(outfile, "#ifdef __STDC__\n");
-       fprintf(outfile, "int %s_rule(int state, int goalnt) {\n", prefix);
-       fprintf(outfile, "#else\n");
-       fprintf(outfile, "int %s_rule(state, goalnt) int state; int goalnt; {\n", prefix);
-       fprintf(outfile, "#endif\n");
-
-       fprintf(outfile, 
-       "\t%s_assert(state >= 0 && state < %d, %s_PANIC(\"Bad state %%d passed to %s_rule\\n\", state));\n",
-                               prefix, globalMap->count, prefix, prefix);
-       fprintf(outfile, "\tswitch(goalnt) {\n");
-
-       for (i = 1; i < last_user_nonterminal; i++) {
-               fprintf(outfile, "\tcase %d:\n", i);
-               fprintf(outfile, "\t\treturn %s_%s_rule(state);\n", prefix, ntVector[i]->name);
-       }
-       fprintf(outfile, "\tdefault:\n");
-       fprintf(outfile, "\t\t%s_PANIC(\"Unknown nonterminal %%d in %s_rule;\\n\", goalnt);\n", prefix, prefix);
-       fprintf(outfile, "\t\tabort();\n");
-       fprintf(outfile, "\t\treturn 0;\n");
-       fprintf(outfile, "\t}\n");
-       fprintf(outfile, "}\n");
-}
-
-static void
-exceptionSwitch(es, sw, pre, post, offset, def) List es; const char *sw; const char *pre; const char *post; int offset; const char *def;
-{
-       if (es) {
-               fprintf(outfile, "\t\tswitch (%s) {\n", sw);
-               for (; es; es = es->next) {
-                       Exception e = (Exception) es->x;
-                       fprintf(outfile, "\t\tcase %d: %s %d; %s\n", e->index, pre, e->value+offset, post);
-               }
-               if (def) {
-                       fprintf(outfile, "\t\tdefault: %s;\n", def);
-               }
-               fprintf(outfile, "\t\t}\n");
-       } else {
-               if (def) {
-                       fprintf(outfile, "\t\t%s;\n", def);
-               }
-       }
-}
-
-static void
-doPlankLabel(op) Operator op;
-{
-       PlankMap im0;
-       PlankMap im1;
-       char buf[100];
-
-       fprintf(outfile, "\tcase %d:\n", op->num);
-       switch (op->arity) {
-       case 0:
-               fprintf(outfile, "\t\treturn %d;\n", op->table->transition[0]->newNum);
-               break;
-       case 1:
-               im0 = op->table->dimen[0]->pmap;
-               if (im0) {
-                       exceptionSwitch(im0->exceptions, "l", "return ", "", im0->offset, 0);
-                       fprintf(outfile, "\t\treturn %s[l].%s + %d;\n", 
-                               im0->values->plank->name, im0->values->fieldname, im0->offset);
-               } else {
-                       Item_Set *ts = transLval(op->table, 1, 0);
-                       if (*ts) {
-                               fprintf(outfile, "\t\treturn %d;\n", (*ts)->newNum);
-                       } else {
-                               fprintf(outfile, "\t\treturn %d;\n", ERROR_VAL);
-                       }
-               }
-               break;
-       case 2:
-               im0 = op->table->dimen[0]->pmap;
-               im1 = op->table->dimen[1]->pmap;
-               if (!im0 && !im1) {
-                       Item_Set *ts = transLval(op->table, 1, 1);
-                       if (*ts) {
-                               fprintf(outfile, "\t\treturn %d;\n", (*ts)->newNum);
-                       } else {
-                               fprintf(outfile, "\t\treturn %d;\n", ERROR_VAL);
-                       }
-               } else if (!im0) {
-                       exceptionSwitch(im1->exceptions, "r", "return ", "", im1->offset, 0);
-                       fprintf(outfile, "\t\treturn %s[r].%s + %d;\n", 
-                               im1->values->plank->name, im1->values->fieldname, im1->offset);
-               } else if (!im1) {
-                       exceptionSwitch(im0->exceptions, "l", "return ", "", im0->offset, 0);
-                       fprintf(outfile, "\t\treturn %s[l].%s + %d;\n", 
-                               im0->values->plank->name, im0->values->fieldname, im0->offset);
-               } else {
-                       assert(im0->offset == 0);
-                       assert(im1->offset == 0);
-                       sprintf(buf, "l = %s[l].%s",
-                               im0->values->plank->name, im0->values->fieldname);
-                       exceptionSwitch(im0->exceptions, "l", "l =", "break;", 0, buf);
-                       sprintf(buf, "r = %s[r].%s",
-                               im1->values->plank->name, im1->values->fieldname);
-                       exceptionSwitch(im1->exceptions, "r", "r =", "break;", 0, buf);
-
-                       fprintf(outfile, "\t\treturn %s_%s_transition[l][r] + %d;\n", 
-                               prefix,
-                               op->name,
-                               op->baseNum);
-               }
-               break;
-       default:
-               assert(0);
-       }
-}
-
-static void
-doPlankLabelMacrosSafely(op) Operator op;
-{
-       PlankMap im0;
-       PlankMap im1;
-
-       switch (op->arity) {
-       case -1:
-               fprintf(outfile, "#define %s_%s_state\t0\n", prefix, op->name);
-               break;
-       case 0:
-               fprintf(outfile, "#define %s_%s_state", prefix, op->name);
-               fprintf(outfile, "\t%d\n", op->table->transition[0]->newNum+1);
-               break;
-       case 1:
-               fprintf(outfile, "#define %s_%s_state(l)", prefix, op->name);
-               im0 = op->table->dimen[0]->pmap;
-               if (im0) {
-                       if (im0->exceptions) {
-                               List es = im0->exceptions;
-                               assert(0);
-                               fprintf(outfile, "\t\tswitch (l) {\n");
-                               for (; es; es = es->next) {
-                                       Exception e = (Exception) es->x;
-                                       fprintf(outfile, "\t\tcase %d: return %d;\n", e->index, e->value ? e->value+im0->offset : 0);
-                               }
-                               fprintf(outfile, "\t\t}\n");
-                       }
-                       if (speedflag) {
-                               fprintf(outfile, "\t( %s[l].%s + %d )\n",
-                                       im0->values->plank->name, im0->values->fieldname,
-                                       im0->offset);
-                       } else {
-                               fprintf(outfile, "\t( (%s_TEMP = %s[l].%s) ? %s_TEMP + %d : 0 )\n",
-                                       prefix,
-                                       im0->values->plank->name, im0->values->fieldname,
-                                       prefix,
-                                       im0->offset);
-                       }
-               } else {
-                       Item_Set *ts = transLval(op->table, 1, 0);
-                       if (*ts) {
-                               fprintf(outfile, "\t%d\n", (*ts)->newNum+1);
-                       } else {
-                               fprintf(outfile, "\t%d\n", 0);
-                       }
-               }
-               break;
-       case 2:
-               fprintf(outfile, "#define %s_%s_state(l,r)", prefix, op->name);
-
-               im0 = op->table->dimen[0]->pmap;
-               im1 = op->table->dimen[1]->pmap;
-               if (!im0 && !im1) {
-                       Item_Set *ts = transLval(op->table, 1, 1);
-                       assert(0);
-                       if (*ts) {
-                               fprintf(outfile, "\t\treturn %d;\n", (*ts)->newNum+1);
-                       } else {
-                               fprintf(outfile, "\t\treturn %d;\n", 0);
-                       }
-               } else if (!im0) {
-                       assert(0);
-                       if (im1->exceptions) {
-                               List es = im1->exceptions;
-                               fprintf(outfile, "\t\tswitch (r) {\n");
-                               for (; es; es = es->next) {
-                                       Exception e = (Exception) es->x;
-                                       fprintf(outfile, "\t\tcase %d: return %d;\n", e->index, e->value ? e->value+im1->offset : 0);
-                               }
-                               fprintf(outfile, "\t\t}\n");
-                       }
-                       fprintf(outfile, "\t\tstate = %s[r].%s; offset = %d;\n", 
-                               im1->values->plank->name, im1->values->fieldname, im1->offset);
-                       fprintf(outfile, "\t\tbreak;\n");
-               } else if (!im1) {
-                       assert(0);
-                       if (im0->exceptions) {
-                               List es = im0->exceptions;
-                               fprintf(outfile, "\t\tswitch (l) {\n");
-                               for (; es; es = es->next) {
-                                       Exception e = (Exception) es->x;
-                                       fprintf(outfile, "\t\tcase %d: return %d;\n", e->index, e->value ? e->value+im0->offset : 0);
-                               }
-                               fprintf(outfile, "\t\t}\n");
-                       }
-                       fprintf(outfile, "\t\tstate = %s[l].%s; offset = %d;\n", 
-                               im0->values->plank->name, im0->values->fieldname, im0->offset);
-                       fprintf(outfile, "\t\tbreak;\n");
-               } else {
-                       assert(im0->offset == 0);
-                       assert(im1->offset == 0);
-                       /*
-                       sprintf(buf, "l = %s[l].%s",
-                               im0->values->plank->name, im0->values->fieldname);
-                       exceptionSwitch(im0->exceptions, "l", "l =", "break;", 0, buf);
-                       sprintf(buf, "r = %s[r].%s",
-                               im1->values->plank->name, im1->values->fieldname);
-                       exceptionSwitch(im1->exceptions, "r", "r =", "break;", 0, buf);
-
-                       fprintf(outfile, "\t\tstate = %s_%s_transition[l][r]; offset = %d;\n", 
-                               prefix,
-                               op->name,
-                               op->baseNum);
-                       fprintf(outfile, "\t\tbreak;\n");
-                       */
-
-                       if (speedflag) {
-                               fprintf(outfile, "\t( %s_%s_transition[%s[l].%s][%s[r].%s] + %d)\n",
-                                       prefix,
-                                       op->name,
-                                       im0->values->plank->name, im0->values->fieldname,
-                                       im1->values->plank->name, im1->values->fieldname,
-                                       op->baseNum);
-                       } else {
-                               fprintf(outfile, "\t( (%s_TEMP = %s_%s_transition[%s[l].%s][%s[r].%s]) ? ",
-                                       prefix,
-                                       prefix,
-                                       op->name,
-                                       im0->values->plank->name, im0->values->fieldname,
-                                       im1->values->plank->name, im1->values->fieldname);
-                               fprintf(outfile, "%s_TEMP + %d : 0 )\n",
-                                       prefix,
-                                       op->baseNum);
-                       }
-               }
-               break;
-       default:
-               assert(0);
-       }
-}
-static void
-doPlankLabelSafely(op) Operator op;
-{
-       fprintf(outfile, "\tcase %d:\n", op->num);
-       switch (op->arity) {
-       case -1:
-               fprintf(outfile, "\t\treturn 0;\n");
-               break;
-       case 0:
-               fprintf(outfile, "\t\treturn %s_%s_state;\n", prefix, op->name);
-               break;
-       case 1:
-               fprintf(outfile, "\t\treturn %s_%s_state(l);\n", prefix, op->name);
-               break;
-       case 2:
-               fprintf(outfile, "\t\treturn %s_%s_state(l,r);\n", prefix, op->name);
-               break;
-       default:
-               assert(0);
-       }
-}
-
-static void
-makePlankState()
-{
-       fprintf(outfile, "\n");
-       fprintf(outfile, "int %s_TEMP;\n", prefix);
-       foreachList((ListFn) doPlankLabelMacrosSafely, operators);
-       fprintf(outfile, "\n");
-
-       fprintf(outfile, "#ifdef __STDC__\n");
-       switch (max_arity) {
-       case -1:
-               fprintf(stderr, "ERROR: no terminals in grammar.\n");
-               exit(1);
-       case 0:
-               fprintf(outfile, "int %s_state(int op) {\n", prefix);
-               fprintf(outfile, "#else\n");
-               fprintf(outfile, "int %s_state(op) int op; {\n", prefix);
-               break;
-       case 1:
-               fprintf(outfile, "int %s_state(int op, int l) {\n", prefix);
-               fprintf(outfile, "#else\n");
-               fprintf(outfile, "int %s_state(op, l) int op; int l; {\n", prefix);
-               break;
-       case 2:
-               fprintf(outfile, "int %s_state(int op, int l, int r) {\n", prefix);
-               fprintf(outfile, "#else\n");
-               fprintf(outfile, "int %s_state(op, l, r) int op; int l; int r; {\n", prefix);
-               break;
-       default:
-               assert(0);
-       }
-       fprintf(outfile, "#endif\n");
-
-       fprintf(outfile, "\tregister int %s_TEMP;\n", prefix);
-
-       fprintf(outfile, "#ifndef NDEBUG\n");
-
-       fprintf(outfile, "\tswitch (op) {\n");
-       opsOfArity(2);
-       if (max_arity >= 2) {
-               fprintf(outfile, 
-               "\t\t%s_assert(r >= 0 && r < %d, %s_PANIC(\"Bad state %%d passed to %s_state\\n\", r));\n",
-                               prefix, globalMap->count, prefix, prefix);
-               fprintf(outfile, "\t\t/*FALLTHROUGH*/\n");
-       }
-       opsOfArity(1);
-       if (max_arity > 1) {
-               fprintf(outfile, 
-               "\t\t%s_assert(l >= 0 && l < %d, %s_PANIC(\"Bad state %%d passed to %s_state\\n\", l));\n",
-                               prefix, globalMap->count, prefix, prefix);
-               fprintf(outfile, "\t\t/*FALLTHROUGH*/\n");
-       }
-       opsOfArity(0);
-       fprintf(outfile, "\t\tbreak;\n");
-       fprintf(outfile, "\t}\n");
-       fprintf(outfile, "#endif\n");
-
-       fprintf(outfile, "\tswitch (op) {\n");
-       fprintf(outfile,"\tdefault: %s_PANIC(\"Unknown op %%d in %s_state\\n\", op); abort(); return 0;\n",
-               prefix, prefix);
-       foreachList((ListFn) doPlankLabelSafely, operators);
-       fprintf(outfile, "\t}\n");
-
-       fprintf(outfile, "}\n");
-}
-
-void
-makePlanks()
-{
-       List planks;
-       renumber();
-       makePmaps();
-       planks = assemblePlanks();
-       purgePlanks(planks);
-       inToEx();
-       makePlankRule();
-       makePlankState();
-}