diff options
Diffstat (limited to 'support/tools/Burg/plank.c')
-rw-r--r-- | support/tools/Burg/plank.c | 921 |
1 files changed, 0 insertions, 921 deletions
diff --git a/support/tools/Burg/plank.c b/support/tools/Burg/plank.c deleted file mode 100644 index 1ce006dd01..0000000000 --- a/support/tools/Burg/plank.c +++ /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(); -} |