📄 gen.c
字号:
}
fatal_internal("genPredTreeOrig: predicate tree is wacked");
}
#if 0
** Predicate member dummyPredDepth is no longer used in MR10
** but we might need it again in the future
**
** if (MRhoisting) {
** if ( !noneHaveContext &&
** ! in_and_expr &&
** p->source != NULL &&
** p->source->dummyPredicateDepth > 0 &&
** p->down == NULL) {
** _gen("(");
** genCombinedPredTreeContext(p);
** _gen(" )\n");
** return;
** };
** };
#endif
/* [genPredTree] */
/* in_and_expr
what to do if the context is wrong
what to do if the context is correct but the predicate is false
remember: if the context is wrong it's the same as if the
predicate is true as far as enabling an alternative
Consider (AND p q r)
if in an ... && ... expression then you don't want
the entire predicate chain to fail just because the
context for one component is wrong: so return true
Consider (OR p q r)
if in an ... || ... expression then you don't want
the entire predicate chain to succeed just because
the context for one component is correct when the
corresponding test is false: so return false when
the context is correct but the test is false.
*/
void
#ifdef __USE_PROTOS
genPredTree( Predicate *p, Node *j, int in_and_expr, int suppress_sva )
#else
genPredTree( p, j, in_and_expr, suppress_sva)
Predicate *p;
Node *j;
int in_and_expr;
int suppress_sva;
#endif
{
int allHaveContext=1;
int noneHaveContext=1;
Tree *groupTree;
Tree *oneTree;
Predicate *q;
int identicalORcontextOptimization=0;
int identicalANDcontextOptimization=0;
if (0 && !MR_usingPredNames && !MRhoisting) {
genPredTreeOrig(p,j,in_and_expr);
return;
};
MR_predContextPresent(p,&allHaveContext,&noneHaveContext);
if ( ! noneHaveContext ) { /* MR10 context guards ignored when -prc off */
_gen("(");
/* MR10 optimize OR predicates which are all leaves */
if (p->expr == PRED_OR_LIST && MR_allPredLeaves(p->down)) {
groupTree=MR_compute_pred_tree_context(p);
for (q=p->down ; q != NULL ; q=q->right) {
oneTree=MR_compute_pred_tree_context(q);
if (! MR_tree_equ(groupTree,oneTree)) {
Tfree(oneTree);
break;
};
Tfree(oneTree);
};
Tfree(groupTree);
if (q == NULL) {
_gen("/* MR10 individual OR gates suppressed when all predicates are leaves");
_gen(" with identical context */\n");
genPredTreeGate(p,in_and_expr); /* use the parent's in_and_expr for this gate */
identicalORcontextOptimization=1;
} else {
MR_distinctORcontextOpt(p,j,in_and_expr);
return;
};
} else if (p->expr == PRED_AND_LIST && MR_allPredLeaves(p->down)) {
/* MR12 optimize AND predicates which are all leaves */
groupTree=MR_compute_pred_tree_context(p);
for (q=p->down ; q != NULL ; q=q->right) {
oneTree=MR_compute_pred_tree_context(q);
if (! MR_tree_equ(groupTree,oneTree)) {
Tfree(oneTree);
break;
};
Tfree(oneTree);
};
Tfree(groupTree);
if (q == NULL) {
_gen("/* MR12 individual AND gates suppressed when all predicates are leaves");
_gen(" with identical context */\n");
genPredTreeGate(p,in_and_expr); /* use the parent's in_and_expr for this gate */
identicalANDcontextOptimization=1;
} else {
genPredTreeGate(p, in_and_expr);
};
} else {
genPredTreeGate(p, in_and_expr);
};
}
/* if leaf node, just gen predicate */
if ( p->down==NULL )
{
genPred(p,j,suppress_sva);
if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */
return;
}
/* if AND list, do both preds (only two possible) */
/* MR10 not any more ! */
if ( p->expr == PRED_AND_LIST )
{
Predicate *list;
_gen("(");
list = p->down;
for (; list != NULL; list=list->right) {
if (identicalANDcontextOptimization) {
genPred(list, j,suppress_sva);
} else {
genPredTree(list, j, 1, suppress_sva); /* in and context */
};
if ( list->right!=NULL ) _gen("&&");
};
_gen(")");
if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */
return;
}
if ( p->expr == PRED_OR_LIST )
{
Predicate *list;
_gen("(");
list = p->down;
for (; list!=NULL; list=list->right)
{
if (identicalORcontextOptimization) {
genPred(list, j,suppress_sva);
} else {
genPredTree(list, j, 0, suppress_sva);
};
if ( list->right!=NULL ) _gen("||");
}
_gen(")");
if ( ! noneHaveContext ) _gen(")"); /* MR10 context guards ignored when -prc off */
return;
}
fatal_internal("predicate tree is wacked");
}
/* [genPredTreeMainXX] */
Predicate * /* MR10 */
#ifdef __USE_PROTOS
genPredTreeMainXX( Predicate *p, Node *j ,int in_and_expr)
#else
genPredTreeMainXX( p, j ,in_and_expr)
Predicate *p;
Node *j;
int in_and_expr;
#endif
{
int allHaveContext=1;
int noneHaveContext=1;
#if 0
fprintf(stderr,"Pred before\n");
dumppred(p);
fprintf(stderr,"\n");
fprintf(stderr,"Pred after\n");
dumppred(p);
fprintf(stderr,"\n");
#endif
p=MR_predSimplifyALL(p); /* MR10 */
require (MR_predicate_context_completed(p),"predicate context is not complete");
MR_cleanup_pred_trees(p); /* MR10 */
MR_predContextPresent(p,&allHaveContext,&noneHaveContext);
if (!noneHaveContext & !allHaveContext) {
warnFL("predicate contains elements both with and without context",
FileStr[j->file],j->line);
};
if (InfoP) {
_gen("\n#if 0\n\n");
MR_dumpPred(p,1);
_gen("#endif\n");
};
genPredTree(p,j,in_and_expr,0);
return p;
}
Predicate * /* MR10 */
#ifdef __USE_PROTOS
genPredTreeMain( Predicate *p, Node *j)
#else
genPredTreeMain( p, j)
Predicate *p;
Node *j;
#endif
{
return genPredTreeMainXX(p,j,1);
}
static void
#ifdef __USE_PROTOS
genExprTreeOriginal( Tree *t, int k )
#else
genExprTreeOriginal( t, k )
Tree *t;
int k;
#endif
{
require(t!=NULL, "genExprTreeOriginal: NULL tree");
if ( t->token == ALT )
{
_gen("("); genExprTreeOriginal(t->down, k); _gen(")");
if ( t->right!=NULL )
{
_gen("||");
on1line++;
if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); }
_gen("("); genExprTreeOriginal(t->right, k); _gen(")");
}
return;
}
if ( t->down!=NULL ) _gen("(");
_gen1("LA(%d)==",k);
if ( TokenString(t->token) == NULL ) _gen1("%d", t->token)
else _gen1("%s", TokenString(t->token));
if ( t->down!=NULL )
{
_gen("&&");
on1line++;
if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); }
_gen("("); genExprTreeOriginal(t->down, k+1); _gen(")");
}
if ( t->down!=NULL ) _gen(")");
if ( t->right!=NULL )
{
_gen("||");
on1line++;
if ( on1line > NumExprPerLine ) { on1line=0; _gen("\n"); }
_gen("("); genExprTreeOriginal(t->right, k); _gen(")");
}
}
#ifdef __USE_PROTOS
static void MR_LAtokenString(int k,int token)
#else
static void MR_LAtokenString(k,token)
int k;
int token;
#endif
{
char *ts;
ts=TokenString(token);
if (ts == NULL) {
_gen2(" LA(%d)==%d",k,token);
} else {
_gen2(" LA(%d)==%s",k,ts);
};
}
#ifdef __USE_PROTOS
static int MR_countLeaves(Tree *t)
#else
static int MR_countLeaves(t)
Tree *t;
#endif
{
if (t == NULL) return 0;
if (t->token == ALT) {
return MR_countLeaves(t->down)+MR_countLeaves(t->right);
} else {
return 1+MR_countLeaves(t->down)+MR_countLeaves(t->right);
};
}
#ifdef __USE_PROTOS
static void MR_genOneLine(Tree *tree,int k)
#else
static void MR_genOneLine(tree,k)
Tree *tree;
int k;
#endif
{
if (tree == NULL) return;
if (tree->token == ALT) {
MR_genOneLine(tree->down,k);
} else {
MR_LAtokenString(k,tree->token);
if (tree->down != NULL &&
tree->down->right == NULL) {
_gen(" &&");
MR_genOneLine(tree->down,k+1);
} else if (tree->down != NULL) {
_gen(" && (");
MR_genOneLine(tree->down,k+1);
_gen(")");
};
};
if (tree->right != NULL) {
_gen(" ||");
MR_genOneLine(tree->right,k);
};
}
static int across;
static int depth;
static int lastkonline;
#ifdef __USE_PROTOS
static void MR_genMultiLine(Tree *tree,int k)
#else
static void MR_genMultiLine(tree,k)
Tree *tree;
int k;
#endif
{
int i;
if (tree == NULL) return;
if (tree->token == ALT) {
MR_genMultiLine(tree,k);
} else {
MR_LAtokenString(k,tree->token);
lastkonline=k;
across++;
if (tree->down != NULL && tree->down->right == NULL) {
if (across > 3) {
_gen("\n");
across=0;
lastkonline=0;
for (i=0 ; i < depth+k ; i++) _gen(" ");
_gen("&&");
} else {
_gen(" &&");
};
MR_genMultiLine(tree->down,k+1);
} else if (tree->down != NULL) {
_gen("\n");
lastkonline=0;
across=0;
for (i=0 ; i < depth+k ; i++) _gen(" ");
_gen("&& (");
MR_genMultiLine(tree->down,k+1);
_gen(")");
};
};
if (tree->right != NULL) {
if (k < lastkonline) {
_gen("\n");
across=0;
lastkonline=0;
for (i=0; i < depth+k-1 ; i++) _gen(" ");
_gen("||");
} else if (across > 3 ) {
_gen("\n");
across=0;
lastkonline=0;
for (i=0; i < depth+k ; i++) _gen(" ");
_gen("||");
} else {
_gen(" ||");
};
MR_genMultiLine(tree->right,k);
};
}
#ifdef __USE_PROTOS
static void genExprTree(Tree *tree,int k)
#else
static void genExprTree(tree,k)
Tree *tree;
int k;
#endif
{
int count;
#if 0
/* MR20 THM This was probably an error.
The routine should probably reference that static
"across" and this declaration hides it.
*/
int across;
#endif
require (tree != NULL,"genExprTree: tree is NULL");
require (k > 0,"genExprTree: k <= 0");
if (0 && !MRhoisting) { /* MR11 make new version standard */
genExprTreeOriginal(tree,k);
} else {
count=MR_countLeaves(tree);
if (count < 5) {
MR_genOneLine(tree,k);
} else {
_gen("\n");
across=0;
depth=0;
lastkonline=0;
MR_genMultiLine(tree,k);
_gen("\n");
};
};
}
/*
* Generate LL(k) type expressions of the form:
*
* (LA(1) == T1 || LA(1) == T2 || ... || LA(1) == Tn) &&
* (LA(2) == T1 || LA(2) == T2 || ... || LA(2) == Tn) &&
* .....
* (LA(k) == T1 || LA(k) == T2 || ... || LA(k) == Tn)
*
* If GenExprSetsOpt generate:
*
* (setwdi[LA(1)]&(1<<j)) && (setwdi[LA(2)]&(1<<j)) ...
*
* where n is set_deg(expr) and Ti is some random token and k is the last nonempty
* set in fset <=CLL_k.
* k=1..CLL_k where CLL_k >= 1.
*
* This routine is visible only to this file and cannot answer a TRANS message.
*
*/
/* [genExpr] */
static int
#ifdef __USE_PROTOS
genExpr( Junction *j )
#else
genExpr( j )
Junction *j;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -