fset2.c
来自「SRI international 发布的OAA框架软件」· C语言 代码 · 共 2,251 行 · 第 1/4 页
C
2,251 行
t = tleft_factor( t );
Tfree(pred->tcontext);
pred->tcontext = t;
}
else
{
REACH(p, 1, &rk, scontext);
require(set_nil(rk), "rk != nil");
set_free(rk);
set_free(pred->scontext[1]);
pred->scontext[1] = scontext;
}
}
/* MR11 - had enough of flags yet ? */
int MR_AmbSourceSearch=0;
int MR_AmbSourceSearchGroup=0;
int MR_AmbSourceSearchChoice=0;
int MR_AmbSourceSearchLimit=0;
int MR_matched_AmbAidRule=0;
static set *matchSets[2]={NULL,NULL};
static int *tokensInChain=NULL;
static Junction *MR_AmbSourceSearchJ[2];
void MR_traceAmbSourceKclient()
{
int i;
set *save_fset;
int save_ConstrainSearch;
set incomplete;
Tree *t;
if (matchSets[0] == NULL) {
matchSets[0]=(set *) calloc (CLL_k+1,sizeof(set));
require (matchSets[0] != NULL,"matchSets[0] alloc");
matchSets[1]=(set *) calloc (CLL_k+1,sizeof(set));
require (matchSets[1] != NULL,"matchSets[1] alloc");
};
for (i=1 ; i <= MR_AmbSourceSearchLimit ; i++) {
set_clr(matchSets[0][i]);
set_orel( (unsigned) tokensInChain[i],
&matchSets[0][i]);
set_clr(matchSets[1][i]);
set_orel( (unsigned) tokensInChain[i],
&matchSets[1][i]);
};
save_fset=fset;
save_ConstrainSearch=ConstrainSearch;
for (i=0 ; i < 2 ; i++) {
#if 0
** fprintf(stdout," Choice:%d Depth:%d ",i+1,MR_AmbSourceSearchLimit);
** fprintf(stdout,"(");
** for (j=1 ; j <= MR_AmbSourceSearchLimit ; j++) {
** if (j != 1) fprintf(stdout," ");
** fprintf(stdout,"%s",TerminalString(tokensInChain[j]));
** };
** fprintf(stdout,")\n\n");
#endif
fset=matchSets[i];
MR_AmbSourceSearch=1;
MR_MaintainBackTrace=1;
MR_AmbSourceSearchChoice=i;
ConstrainSearch=1;
maxk = MR_AmbSourceSearchLimit;
incomplete=empty;
t=NULL;
constrain = &(fset[1]);
MR_pointerStackReset(&MR_BackTraceStack);
TRAV(MR_AmbSourceSearchJ[i],maxk,&incomplete,t);
Tfree(t);
require (set_nil(incomplete),"MR_traceAmbSourceK TRAV incomplete");
require (MR_BackTraceStack.count == 0,"K: MR_BackTraceStack.count != 0");
set_free(incomplete);
};
ConstrainSearch=save_ConstrainSearch;
fset=save_fset;
MR_AmbSourceSearch=0;
MR_MaintainBackTrace=0;
MR_AmbSourceSearchChoice=0;
}
#ifdef __USE_PROTOS
Tree *tTrunc(Tree *t,int depth)
#else
Tree *tTrunc(t,depth)
Tree *t;
#endif
{
Tree *u;
require ( ! (t == NULL && depth > 0),"tree too short");
if (depth == 0) return NULL;
if (t->token == ALT) {
u=tTrunc(t->down,depth);
} else {
u=tnode(t->token);
u->down=tTrunc(t->down,depth-1);
};
if (t->right != NULL) u->right=tTrunc(t->right,depth);
return u;
}
#ifdef __USE_PROTOS
void MR_iterateOverTree(Tree *t,int chain[])
#else
void MR_iterateOverTree(t,chain)
Tree *t;
int chain[];
#endif
{
if (t == NULL) return;
chain[0]=t->token;
if (t->down != NULL) {
MR_iterateOverTree(t->down,&chain[1]);
} else {
MR_traceAmbSourceKclient();
};
MR_iterateOverTree(t->right,&chain[0]);
chain[0]=0;
}
#ifdef __USE_PROTOS
void MR_traceAmbSourceK(Tree *t,Junction *alt1,Junction *alt2)
#else
void MR_traceAmbSourceK(t,alt1,alt2)
Tree *t;
Junction *alt1;
Junction *alt2;
#endif
{
int i;
int depth;
int maxDepth;
Tree *truncatedTree;
if (MR_AmbAidRule == NULL) return;
if ( ! (
strcmp(MR_AmbAidRule,alt1->rname) == 0 ||
strcmp(MR_AmbAidRule,alt2->rname) == 0 ||
MR_AmbAidLine==alt1->line ||
MR_AmbAidLine==alt2->line
)
) return;
MR_matched_AmbAidRule++;
/* there are no token sets in trees, only in TokNodes */
MR_AmbSourceSearchJ[0]=analysis_point( (Junction *) alt1->p1);
MR_AmbSourceSearchJ[1]=analysis_point( (Junction *) alt2->p1);
if (tokensInChain == NULL) {
tokensInChain=(int *) calloc (CLL_k+1,sizeof(int));
require (tokensInChain != NULL,"tokensInChain alloc");
};
MR_AmbSourceSearchGroup=0;
fprintf(stdout,"\n");
fprintf(stdout," Ambiguity Aid ");
fprintf(stdout,
(MR_AmbAidDepth <= LL_k ?
"(-k %d -aa %s %s -aad %d)\n\n" :
"(-k %d -aa %s %s [-k value limits -aad %d])\n\n"),
LL_k,
MR_AmbAidRule,
(MR_AmbAidMultiple ? "-aam" : ""),
MR_AmbAidDepth);
for (i=0 ; i < 2 ; i++) {
fprintf(stdout," Choice %d: %-25s line %d file %s\n",
(i+1),
MR_ruleNamePlusOffset( (Node *) MR_AmbSourceSearchJ[i]),
MR_AmbSourceSearchJ[i]->line,
FileStr[MR_AmbSourceSearchJ[i]->file]);
};
fprintf(stdout,"\n");
if (MR_AmbAidDepth < LL_k) {
maxDepth=MR_AmbAidDepth;
} else {
maxDepth=LL_k;
};
for (depth=1 ; depth <= maxDepth; depth++) {
MR_AmbSourceSearchLimit=depth;
if (depth < LL_k) {
truncatedTree=tTrunc(t,depth);
truncatedTree=tleft_factor(truncatedTree);
MR_iterateOverTree(truncatedTree,&tokensInChain[1]); /* <===== */
Tfree(truncatedTree);
} else {
MR_iterateOverTree(t,tokensInChain); /* <===== */
};
fflush(stdout);
fflush(stderr);
};
fprintf(stdout,"\n");
MR_AmbSourceSearch=0;
MR_MaintainBackTrace=0;
MR_AmbSourceSearchGroup=0;
MR_AmbSourceSearchChoice=0;
MR_AmbSourceSearchLimit=0;
}
/* this if for k=1 grammars only
this is approximate only because of the limitations of linear
approximation lookahead. Don't want to do a k=3 search when
the user only specified a ck=3 grammar
*/
#ifdef __USE_PROTOS
void MR_traceAmbSource(set *matchSets,Junction *alt1, Junction *alt2)
#else
void MR_traceAmbSource(matchSets,alt1,alt2)
set *matchSets;
Junction *alt1;
Junction *alt2;
#endif
{
set *save_fset;
Junction *p[2];
int i;
int j;
set *dup_matchSets;
set intersection;
set incomplete;
set tokensUsed;
int depth;
if (MR_AmbAidRule == NULL) return;
if ( ! (
strcmp(MR_AmbAidRule,alt1->rname) == 0 ||
strcmp(MR_AmbAidRule,alt2->rname) == 0 ||
MR_AmbAidLine==alt1->line ||
MR_AmbAidLine==alt2->line
)
) return;
MR_matched_AmbAidRule++;
save_fset=fset;
dup_matchSets=(set *) calloc(CLL_k+1,sizeof(set));
require (dup_matchSets != NULL,"Can't allocate dup_matchSets");
p[0]=analysis_point( (Junction *) alt1->p1);
p[1]=analysis_point( (Junction *) alt2->p1);
fprintf(stdout,"\n");
fprintf(stdout," Ambiguity Aid ");
fprintf(stdout,
(MR_AmbAidDepth <= CLL_k ?
"(-ck %d -aa %s %s -aad %d)\n\n" :
"(-ck %d -aa %s %s [-ck value limits -aad %d])\n\n"),
CLL_k,
MR_AmbAidRule,
(MR_AmbAidMultiple ? "-aam" : ""),
MR_AmbAidDepth);
for (i=0 ; i < 2 ; i++) {
fprintf(stdout," Choice %d: %-25s line %d file %s\n",
(i+1),
MR_ruleNamePlusOffset( (Node *) p[i]),
p[i]->line,FileStr[p[i]->file]);
};
for (j=1; j <= CLL_k ; j++) {
fprintf(stdout,"\n Intersection of lookahead[%d] sets:\n",j);
intersection=set_and(alt1->fset[j],alt2->fset[j]);
MR_dumpTokenSet(stdout,2,intersection);
set_free(intersection);
};
fprintf(stdout,"\n");
require (1 <= MR_AmbAidDepth && MR_AmbAidDepth <= CLL_k,
"illegal MR_AmbAidDepth");
MR_AmbSourceSearchGroup=0;
for (depth=1; depth <= MR_AmbAidDepth; depth++) {
MR_AmbSourceSearchLimit=depth;
for (i=0 ; i < 2 ; i++) {
/*** fprintf(stdout," Choice:%d Depth:%d\n\n",i+1,depth); ***/
for (j=0 ; j <= CLL_k ; j++) { dup_matchSets[j]=set_dup(matchSets[j]); };
fset=dup_matchSets;
fflush(output);
fflush(stdout);
MR_AmbSourceSearch=1;
MR_MaintainBackTrace=1;
MR_AmbSourceSearchChoice=i;
maxk = depth;
tokensUsed=empty;
incomplete=empty;
constrain = &(fset[1]);
MR_pointerStackReset(&MR_BackTraceStack);
REACH(p[i],depth,&incomplete,tokensUsed);
fflush(output);
fflush(stdout);
require (set_nil(incomplete),"MR_traceAmbSource REACH incomplete");
require (MR_BackTraceStack.count == 0,"1: MR_BackTraceStack.count != 0");
set_free(incomplete);
set_free(tokensUsed);
for (j=0 ; j <= CLL_k ; j++) { set_free(dup_matchSets[j]); };
};
};
fprintf(stdout,"\n");
MR_AmbSourceSearch=0;
MR_MaintainBackTrace=0;
MR_AmbSourceSearchGroup=0;
MR_AmbSourceSearchChoice=0;
MR_AmbSourceSearchLimit=0;
fset=save_fset;
free ( (char *) dup_matchSets);
}
static int itemCount;
void MR_backTraceDumpItemReset() {
itemCount=0;
}
#ifdef __USE_PROTOS
void MR_backTraceDumpItem(FILE *f,int skip,Node *n)
#else
void MR_backTraceDumpItem(f,skip,n)
FILE *f;
int skip;
Node *n;
#endif
{
TokNode *tn;
RuleRefNode *rrn;
Junction *j;
ActionNode *a;
switch (n->ntype) {
case nToken:
itemCount++; if (skip) goto EXIT;
tn=(TokNode *)n;
if (set_nil(tn->tset)) {
fprintf(f," %2d #token %-23s",itemCount,TerminalString(tn->token));
} else {
fprintf(f," %2d #tokclass %-20s",itemCount,TerminalString(tn->token));
};
break;
case nRuleRef:
itemCount++; if (skip) goto EXIT;
rrn=(RuleRefNode *)n;
fprintf(f," %2d to %-27s",itemCount,rrn->text);
break;
case nAction:
a=(ActionNode *)n;
goto EXIT;
case nJunction:
j=(Junction *)n;
switch (j->jtype) {
case aSubBlk:
if (j->guess) {
itemCount++; if (skip) goto EXIT;
fprintf(f," %2d %-30s",itemCount,"in (...)? block at");
break;
};
/****** fprintf(f," %2d %-32s",itemCount,"in (...) block at"); *******/
/****** break; *******/
goto EXIT;
case aOptBlk:
itemCount++; if (skip) goto EXIT;
fprintf(f," %2d %-30s",itemCount,"in {...} block");
break;
case aLoopBlk:
itemCount++; if (skip) goto EXIT;
fprintf(f," %2d %-30s",itemCount,"in (...)* block");
break;
case EndBlk:
if (j->alpha_beta_guess_end) {
itemCount++; if (skip) goto EXIT;
fprintf(f," %2d %-30s",itemCount,"end (...)? block at");
break;
};
goto EXIT;
/****** fprintf(f," %2d %-32s",itemCount,"end of a block at"); *****/
/****** break; *****/
case RuleBlk:
itemCount++; if (skip) goto EXIT;
fprintf(f," %2d %-30s",itemCount,j->rname);
break;
case Generic:
goto EXIT;
case EndRule:
itemCount++; if (skip) goto EXIT;
fprintf (f," %2d end %-26s",itemCount,j->rname);
break;
case aPlusBlk:
itemCount++; if (skip) goto EXIT;
fprintf(f," %2d %-30s",itemCount,"in (...)+ block");
break;
case aLoopBegin:
goto EXIT;
};
break;
};
fprintf(f," %-23s line %-4d %s\n",MR_ruleNamePlusOffset(n),n->line,FileStr[n->file]);
EXIT:
return;
}
static PointerStack previousBackTrace={0,0,NULL};
#ifdef __USE_PROTOS
void MR_backTraceReport(void)
#else
void MR_backTraceReport()
#endif
{
int i;
int match = 0;
int limitMatch;
Node *p;
TokNode *tn;
set remainder;
int depth;
/* Even when doing a k=2 search this routine can get
called when there is only 1 token on the stack.
This is because something like rRuleRef can change
the search value of k from 2 to 1 temporarily.
It does this because the it wants to know the k=1
first set before it does a k=2 search
*/
depth=0;
for (i=0; i < MR_BackTraceStack.count ; i++) {
p=(Node *) MR_BackTraceStack.data[i];
if (p->ntype == nToken) depth++;
};
/* MR14 */ if (MR_AmbSourceSearch) {
/* MR14 */ require (depth <= MR_AmbSourceSearchLimit,"depth > MR_AmbSourceSearchLimit");
/* MR14 */ }
/* MR23 THM - Traceback report was being called at the wrong time for -alpha reports */
/* Reported by Arpad Beszedes (beszedes@inf.u-szeged.hu) */
if (MR_AmbSourceSearchLimit == 0 || depth < MR_AmbSourceSearchLimit) {
return;
};
MR_backTraceDumpItemReset();
limitMatch=MR_BackTraceStack.count;
if (limitMatch > previousBackTrace.count) {
limitMatch=previousBackTrace.count;
};
for (match=0; match < limitMatch; match++) {
if (MR_BackTraceStack.data[match] !=
previousBackTrace.data[match]) {
break;
};
};
/* not sure at the moment why there would be duplicates */
if (match != MR_BackTraceStack.count) {
fprintf(stdout," Choice:%d Depth:%d Group:%d",
(MR_AmbSourceSearchChoice+1),
MR_AmbSourceSearchLimit,
++MR_AmbSourceSearchGroup);
depth=0;
fprintf(stdout," (");
for (i=0; i < MR_BackTraceStack.count ; i++) {
p=(Node *) MR_BackTraceStack.data[i];
if (p->ntype != nToken) continue;
tn=(TokNode *)p;
if (depth != 0) fprintf(stdout," ");
fprintf(stdout,TerminalString(tn->token));
depth++;
if (! MR_AmbAidMultiple) {
if (set_nil(tn->tset)) {
set_rm( (unsigned) tn->token,fset[depth]);
} else {
remainder=set_dif(fset[depth],tn->tset);
set_free(fset[depth]);
fset[depth]=remainder;
};
};
};
fprintf(stdout,")\n");
for (i=0; i < MR_BackTraceStack.count ; i++) {
MR_backTraceDumpItem(stdout, (i<match) ,(Node *) MR_BackTraceStack.data[i]);
};
fprintf(stdout,"\n");
fflush(stdout);
MR_pointerStackReset(&previousBackTrace);
for (i=0; i < MR_BackTraceStack.count ; i++) {
MR_pointerStackPush(&previousBackTrace,MR_BackTraceStack.data[i]);
};
};
}
#ifdef __USE_PROTOS
void MR_setConstrainPointer(set * newConstrainValue)
#else
void MR_setConstrainPointer(newConstrainValue)
set * newConstrainValue;
#endif
{
constrain=newConstrainValue;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?