Change the predicate stuff to use costs instead; now you can use when clauses
on leaves. Remove an iburg premature optimisation (required for above).
This commit is contained in:
parent
d96ceea08a
commit
434eafd35d
|
@ -24,6 +24,7 @@ static void print(char* fmt, ...);
|
|||
static void ckreach(Nonterm p);
|
||||
static void emitclosure(Nonterm nts);
|
||||
static void emitcost(Tree t, char* v);
|
||||
static void emitcostcalc(Rule r);
|
||||
static void emitdefs(Nonterm nts, int ntnumber);
|
||||
static void emitfuncs(void);
|
||||
static void emitheader(void);
|
||||
|
@ -34,7 +35,6 @@ static void emitnts(Rule rules, int nrules);
|
|||
static void emitrecord(char* pre, Rule r, int cost);
|
||||
static void emitrule(Nonterm nts);
|
||||
static void emitpredicatedefinitions(Rule rules);
|
||||
static void emitpredicatecall(Rule rule);
|
||||
static void emitstate(Term terms, Nonterm start, int ntnumber);
|
||||
static void emitstring(Rule rules);
|
||||
static void emitstruct(Nonterm nts, int ntnumber);
|
||||
|
@ -283,9 +283,6 @@ Rule rule(char* id, Tree pattern, int ern, Stringlist when, int cost)
|
|||
Rule *q;
|
||||
Term p = pattern->op;
|
||||
|
||||
if (when && (p->arity == 0))
|
||||
yyerror("can't have a when clause on leaf nodes");
|
||||
|
||||
nrules++;
|
||||
r->when = when;
|
||||
r->lhs = nonterm(id);
|
||||
|
@ -421,11 +418,6 @@ static void emitcase(Term p, int ntnumber)
|
|||
{
|
||||
case 0:
|
||||
case -1:
|
||||
if (!Tflag)
|
||||
{
|
||||
emitleaf(p, ntnumber);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
print("%2assert(l);\n");
|
||||
|
@ -442,26 +434,21 @@ static void emitcase(Term p, int ntnumber)
|
|||
{
|
||||
case 0:
|
||||
case -1:
|
||||
print("%2if (");
|
||||
emitpredicatecall(r);
|
||||
print(")\n%2{%1/* %R */\n%3c = ", r);
|
||||
print("%2{%1/* %R */\n%3c = ", r);
|
||||
emitcostcalc(r);
|
||||
break;
|
||||
case 1:
|
||||
if (r->pattern->nterms > 1)
|
||||
{
|
||||
print("%2if (%1/* %R */\n", r);
|
||||
emittest(r->pattern->left, "l", " ");
|
||||
print("%3&& ");
|
||||
emitpredicatecall(r);
|
||||
print("\n");
|
||||
print("%2) {\n%3c = ");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("%2if (");
|
||||
emitpredicatecall(r);
|
||||
print(")\n%2{%1/* %R */\n%3c = ", r);
|
||||
print("%2{%1/* %R */\n%3c = ", r);
|
||||
}
|
||||
emitcostcalc(r);
|
||||
emitcost(r->pattern->left, "l");
|
||||
break;
|
||||
case 2:
|
||||
|
@ -471,17 +458,13 @@ static void emitcase(Term p, int ntnumber)
|
|||
emittest(r->pattern->left, "l",
|
||||
r->pattern->right->nterms ? " && " : " ");
|
||||
emittest(r->pattern->right, "r", " ");
|
||||
print("%3&& ");
|
||||
emitpredicatecall(r);
|
||||
print("\n");
|
||||
print("%2) {\n%3c = ");
|
||||
}
|
||||
else
|
||||
{
|
||||
print("%2if (");
|
||||
emitpredicatecall(r);
|
||||
print(")\n%2{%1/* %R */\n%3c = ", r);
|
||||
print("%2{%1/* %R */\n%3c = ", r);
|
||||
}
|
||||
emitcostcalc(r);
|
||||
emitcost(r->pattern->left, "l");
|
||||
emitcost(r->pattern->right, "r");
|
||||
break;
|
||||
|
@ -668,46 +651,6 @@ static void closure(int cost[], Rule rule[], Nonterm p, int c)
|
|||
}
|
||||
}
|
||||
|
||||
/* emitleaf - emit state code for a leaf */
|
||||
static void emitleaf(Term p, int ntnumber)
|
||||
{
|
||||
int i;
|
||||
Rule r;
|
||||
static int* cost;
|
||||
static Rule* rule;
|
||||
|
||||
if (cost == NULL)
|
||||
{
|
||||
cost = calloc(ntnumber+1, sizeof *cost);
|
||||
rule = calloc(ntnumber+1, sizeof *rule);
|
||||
}
|
||||
for (i = 0; i <= ntnumber; i++)
|
||||
{
|
||||
cost[i] = maxcost;
|
||||
rule[i] = NULL;
|
||||
}
|
||||
for (r = p->rules; r; r = r->next)
|
||||
if (r->pattern->left == NULL && r->pattern->right == NULL)
|
||||
{
|
||||
cost[r->lhs->number] = r->cost;
|
||||
rule[r->lhs->number] = r;
|
||||
closure(cost, rule, r->lhs, r->cost);
|
||||
}
|
||||
print("%2{\n%3static struct %Pstate z = { %d, 0, 0,\n%4{%10,\n", p->esn);
|
||||
for (i = 1; i <= ntnumber; i++)
|
||||
if (cost[i] < maxcost)
|
||||
print("%5%d,%1/* %R */\n", cost[i], rule[i]);
|
||||
else
|
||||
print("%5%d,\n", cost[i]);
|
||||
print("%4},{\n");
|
||||
for (i = 1; i <= ntnumber; i++)
|
||||
if (rule[i])
|
||||
print("%5%d,%1/* %R */\n", rule[i]->packed, rule[i]);
|
||||
else
|
||||
print("%50,\n");
|
||||
print("%4}\n%3};\n%3return (STATE_TYPE)&z;\n%2}\n");
|
||||
}
|
||||
|
||||
/* computents - fill in bp with burm_nts vector for tree t */
|
||||
static char* computents(Tree t, char* bp)
|
||||
{
|
||||
|
@ -815,13 +758,11 @@ static void emitpredicatedefinitions(Rule r)
|
|||
}
|
||||
}
|
||||
|
||||
/* emitpredicatecall - emit a call to a predicate */
|
||||
static void emitpredicatecall(Rule r)
|
||||
/* emitcost - emit a cost calculation via a predicate */
|
||||
static void emitcostcalc(Rule r)
|
||||
{
|
||||
if (r->when)
|
||||
print("%Ppredicate_%d(node)", r->ern);
|
||||
else
|
||||
print("1");
|
||||
print("!%Ppredicate_%d(node) ? %d : ", r->ern, maxcost);
|
||||
}
|
||||
|
||||
/* emitstate - emit state function */
|
||||
|
@ -837,15 +778,17 @@ static void emitstate(Term terms, Nonterm start, int ntnumber)
|
|||
"%1struct %Pstate* r = (struct %Pstate *)right;\n"
|
||||
"\n"
|
||||
"%1assert(sizeof (STATE_TYPE) >= sizeof (void *));\n%1");
|
||||
if (!Tflag)
|
||||
print("if (%Parity[op] > 0) ");
|
||||
print("{\n%2p = ALLOC(sizeof *p);\n"
|
||||
"%2%Passert(p, PANIC(\"ALLOC returned NULL in %Pstate\\n\"));\n"
|
||||
"%2p->op = op;\n%2p->left = l;\n%2p->right = r;\n%2p->rule.%P%S = 0;\n",
|
||||
print("%1p = ALLOC(sizeof *p);\n"
|
||||
"%1%Passert(p, PANIC(\"ALLOC returned NULL in %Pstate\\n\"));\n"
|
||||
"%1p->op = op;\n"
|
||||
"%1p->left = l;\n"
|
||||
"%1p->right = r;\n"
|
||||
"%1p->rule.%P%S = 0;\n",
|
||||
start);
|
||||
for (i = 1; i <= ntnumber; i++)
|
||||
print("%2p->cost[%d] =\n", i);
|
||||
print("%3%d;\n%1}\n%1switch (op) {\n", maxcost);
|
||||
print("%1p->cost[%d] =\n", i);
|
||||
print("%2%d;\n"
|
||||
"%1switch (op) {\n", maxcost);
|
||||
for (p = terms; p; p = p->link)
|
||||
emitcase(p, ntnumber);
|
||||
print("%1default:\n"
|
||||
|
|
|
@ -32,7 +32,10 @@ int main(void) {
|
|||
NODEPTR_TYPE p;
|
||||
|
||||
p = tree(STORE,
|
||||
tree(LABEL, 0, 0),
|
||||
tree(ADD,
|
||||
tree(LABEL, 0, 0),
|
||||
tree(CONST, 0, 0)
|
||||
),
|
||||
tree(ADD,
|
||||
tree(LOAD,
|
||||
tree(LABEL, 0, 0),
|
||||
|
|
Loading…
Reference in a new issue